这应该很简单.我正在使用ANTLR编写词法分析器语法,并希望将变量标识符的最大长度限制为30个字符.我试图用这一行完成这个(遵循正常的正则表达式 - 除了''thing - 语法):
ID : ('a'..'z'|'A'..'Z') ('a'..'z'|'A'..'Z'|'0'..'9'|'_'){0,29} {System.out.println("IDENTIFIER FOUND.");}
;
Run Code Online (Sandbox Code Playgroud)
代码生成没有错误,但由于生成的代码中的一行简单而导致编译失败:
0,29
显然,antlr将括号内的文本部分与打印线一起放在接受状态区域.我搜索了ANTLR网站,但没有找到相应表达式的示例或引用.这个表达式的语法应该是什么?
ANTLR不支持{m,n}
量词语法.ANTLR看到了{}
你的量词,并且无法区分{}
你的行为.
解决方法:
这是将ID限制为8的手动规则的示例.
SUBID : ('a'..'z'|'A'..'Z'|'0'..'9'|'_')
;
ID : ('a'..'z'|'A'..'Z')
(SUBID (SUBID (SUBID (SUBID (SUBID (SUBID SUBID?)?)?)?)?)?)?
;
Run Code Online (Sandbox Code Playgroud)
就个人而言,我会选择语义解决方案(#1).现在几乎没有理由限制语言中的标识符,甚至更少的理由在违反这样的规则时导致语法错误(编译的早期中止).
归档时间: |
|
查看次数: |
3067 次 |
最近记录: |