COBOL的ANTLR语法标识符

COBOL的ANTLR语法标识符,antlr,antlr4,cobol,Antlr,Antlr4,Cobol,我正在为COBOL语言编写语法,我制定了一个规则来识别COBOL中的单词。 我的标识符规则是 IDENTIFIER : [a-zA-Z0-9]+ ([-_]+ [a-zA-Z0-9]+)*; 它在大多数情况下都可以正常工作,但是当我测试以下输入时 0000主程序 那么它就不起作用了。 请分享你宝贵的想法,让我变得正确。我怎样才能解决这个问题 根据,如果连字符是第一个或最后一个,则应将其视为字符而不是范围运算符。这可能不适用于ANTLR4类似正则表达式的lexer令牌定义 另外,您提出的COBO

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

IDENTIFIER : [a-zA-Z0-9]+ ([-_]+ [a-zA-Z0-9]+)*;
它在大多数情况下都可以正常工作,但是当我测试以下输入时

0000主程序

那么它就不起作用了。 请分享你宝贵的想法,让我变得正确。我怎样才能解决这个问题

根据,如果连字符是第一个或最后一个,则应将其视为字符而不是范围运算符。这可能不适用于ANTLR4类似正则表达式的lexer令牌定义

另外,您提出的COBOL单词定义有几个问题

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

COBOL单词具有以下规则:

  • 由字符组成[A-Za-z0-9_-]
  • 不能以短划线开始或结束
  • 不能以下划线开头
  • 必须至少包含一个大写字母或小写字母[A-Za-z]
我认为上述拟议定义存在两个问题

  • 不允许下划线作为最终字符
  • 不需要字母字符。例如,上述定义允许所有数字 我建议对COBOL单词使用以下ANTLR4词法定义:

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


    但在我的其他语法中,它工作得很好。:(在我所知道的regexp中,你需要对破折号字符进行转义:
    IDENTIFIER:[a-zA-Z0-9]+([\-\\+[a-zA-Z0-9]+)*;
    nevermind,似乎我是那种因为不知道如何工作而逃避一切的人:)为了更好的答案,我认为你应该发布你的语法文件。很可能破折号被视为一个范围运算符。将其放在集合的最后一位:
    [\u-]
    将强制将其作为普通字符进行处理。请注意:我在Antlr4中尝试了建议的标识符,但它甚至不接近。我怀疑作者是在“装腔作势”。
    // 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