【问题标题】:ANTLR grammar Identifier for COBOLCOBOL 的 ANTLR 语法标识符
【发布时间】:2015-09-23 07:46:29
【问题描述】:

我正在为 COBOL 语言编写语法,并且我制定了一个规则来识别 COBOL 中的单词。 我的标识符规则是

IDENTIFIER : [a-zA-Z0-9]+ ([-_]+ [a-zA-Z0-9]+)*;

它在我的大多数情况下都可以正常工作,但是当我对以下输入进行测试时

0000-主程序

然后它不起作用。 请分享您的宝贵想法,以使我正确。我该如何解决这个问题。

【问题讨论】:

  • 但它在我的其他语法中工作正常。:(
  • 在我所知道的正则表达式中,您需要转义破折号字符:IDENTIFIER : [a-zA-Z0-9]+ ([\-_]+ [a-zA-Z0-9]+)*; 没关系,好​​像我是那些逃避一切的人之一,因为我没有不知道它是如何工作的 :) 为了获得更好的答案,我认为您应该发布您的语法文件。
  • 很可能破折号被视为范围运算符。将其放在集合的最后:[_-] 将强制视为普通角色。

标签: antlr antlr4 cobol


【解决方案1】:

根据Regex - Should hyphens be escaped?,如果连字符是第一个或最后一个,则应将其视为字符而不是范围运算符。这可能不适用于 ANTLR4 的类似正则表达式的词法分析器令牌定义。

另外,您提出的 COBOL 词定义存在一些问题

标识符:[a-zA-Z0-9]+ ([-_]+ [a-zA-Z0-9]+)*;

COBOL 词具有以下规则:

  • 由字符 [A-Za-z0-9_-] 组成
  • 不能以 - 破折号开头或结尾
  • 不能以 _ 下划线开头
  • 必须至少包含一个大写或小写字母 [A-Za-z]

我发现上面提出的定义存在两个问题

  1. 不允许下划线作为结尾字符
  2. 不需要字母字符。例如,上面的定义允许所有数字。

我建议对 COBOL 词使用以下 ANTLR4 词法分析器定义:

标识符:([0-9][0-9_-])? [A-Za-z] ([A-Za-z0-9_-][A-Za-z0-9_])? ;

// IBM Enterprise COBOL Language Reference V4.2
// Enterprise COBOL for z/OS
// Language Reference
// Version 4 Release 2
// SC23-8528-01
// Second Edition (August 2009)
// Page 9
// PDF page 31

【讨论】:

  • 请注意:我在 Antlr4 中尝试了建议的标识符,但它甚至不接近。我怀疑作者是在“耍花招”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-19
  • 2012-01-02
  • 1970-01-01
  • 2021-08-15
相关资源
最近更新 更多