我正在编写COBOL语言的语法,并且我制定了一个规则来识别COBOL中的单词。我的标识符规则是
IDENTIFIER : [a-zA-Z0-9]+ ([-_]+ [a-zA-Z0-9]+)*;
在大多数情况下都可以正常工作,但是当我测试以下输入
时0000 -主要常规
则不工作。请分享你的宝贵意见,以使我正确。我该如何解决这个问题?
根据Regex -连字符应该转义吗?,如果连字符是第一个或最后一个,则应将其视为字符而不是范围操作符。这可能不适用于ANTLR4的类似regex的词法分析器令牌定义。
单独地,您所建议的COBOL字
的定义存在几个问题标识符:[a-zA-Z0-9 ]+ ([-_]+ [
a-zA-Z0-9] +) *;
COBOL字有以下规则:
- 由字符[A-Za-z0-9_-]组成
- 不能以-破折号 开头或结尾
- 不能以_下划线 开头
- 必须包含至少一个大写或小写字母[A-Za-z]
我看到上面提出的定义有两个问题
- 不允许下划线作为最后字符
- 不需要alpha字符。例如,上面的定义允许所有数字。
我建议为COBOL单词定义以下ANTLR4词法分析器:
IDENTIFIER: ([0-9][0-9_-])?[[A-Za-z] (- 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