这应该相当简单。 我正在使用 ANTLR 研究词法分析器语法,并希望将变量标识符的最大长度限制为 30 个字符。我试图用这一行来完成这个(遵循正常的正则表达式 - 除了''东西 - 语法):
ID : ('a'..'z'|'A'..'Z') ('a'..'z'|'A'..'Z'|'0'..'9'|'_'){0,29} {System.out.println("IDENTIFIER FOUND.");}
;
代码生成没有错误,但由于生成的代码中有一行代码导致编译失败:
0,29
显然 antlr 正在获取括号之间的文本部分并将其与打印行一起放置在接受状态区域中。我搜索了 ANTLR 站点,但没有找到等效表达式的示例或引用。 这个表达式的语法应该是什么?
最佳答案
ANTLR 不支持 {m,n}
量词语法。 ANTLR 会看到您的量词的 {}
,但无法将它们与您的操作周围的 {}
区分开来。
解决方法:
- 在语义上强制执行限制。让它收集一个无限大小的 ID,然后在您的操作代码中或稍后在编译器中提示/截断它。
- 手动创建量化规则。
这是将 ID 限制为 8 个的手动规则示例。
SUBID : ('a'..'z'|'A'..'Z'|'0'..'9'|'_')
;
ID : ('a'..'z'|'A'..'Z')
(SUBID (SUBID (SUBID (SUBID (SUBID (SUBID SUBID?)?)?)?)?)?)?
;
就我个人而言,我会选择语义解决方案 (#1)。现在很少有理由限制语言中的标识符,更没有理由在违反此类规则时导致语法错误(编译提前中止)。
关于java - ANTLR 正则表达式中的范围量词语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12188827/