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