我在处理空白时遇到一些麻烦。在以下语法摘录中,我设置了词法分析器,以便解析器跳过空格:
ENTITY_VAR
: 'user'
| 'resource'
;
INT : DIGIT+ | '-' DIGIT+ ;
ID : LETTER (LETTER | DIGIT | SPECIAL)* ;
ENTITY_ID : '__' ENTITY_VAR ('_w_' ID)?;
NEWLINE : '\r'? '\n';
WS : [ \t\r\n]+ -> skip; // skip spaces, tabs, newlines
fragment LETTER : [a-zA-Z];
fragment DIGIT : [0-9];
fragment SPECIAL : ('_' | '#' );
问题是,我想匹配表单的变量名称ENTITY_ID
使得匹配的字符串没有任何空格。像我在这里所做的那样将其编写为词法分析器规则就足够了,但问题是我想用解析器规则来代替,因为我想直接访问这两个标记ENTITY_VAR
and ID
单独从我的代码中取出,而不是将它们压缩到一个完整的令牌中ENTITY_ID
.
有什么想法吗?
基本上任何让我直接访问的解决方案ENTITY_VAR
and ID
适合我,离开ENTITY_ID
作为词法分析器规则或将其移至解析器。
我能想到的有几种方法(排名不分先后):
- 从规则中发出多个令牌
ENTITY_ID
. See ANTLR4:如何注入代币 https://stackoverflow.com/questions/18001009/antlr4-how-to-inject-tokens寻求灵感
- 在解析器中允许空格并随后检查
- 使用单个令牌并拆分代码
- 使用单个令牌并修改令牌流before将其传递给解析器。 IE。莱克斯,修改
ENTITY_ID
令牌并将它们拆分为几个其他令牌,然后将此流传递给解析器
- 不要跳过空格,并且在处理这些“额外标记”时检查它们是否在
ENTITY_ID
部分(=> 是错误)或不是(=> 忽略错误)。
- 不要跳过空格并在语法中允许空格的任何地方添加“WS*”(如果语法不是太大,则可以)。
- 在解析器规则中插入谓词,检查之间是否有空格。
-
创建一个像这样的“陷阱”规则:
INVALID_ENTITY_ID : '__' WS+ ENTITY_VAR WS? ('_w_' WS? ID)?
| '__' WS? ENTITY_VAR WS+ ('_w_' WS? ID)?
| '__' WS? ENTITY_VAR WS? ('_w_' WS+ ID)
;
这会捕获无效的ENTITY_ID
s,因为它比也将成为单独标记的部分更长。
我会选择 2,如果它不会改变“非错误”情况下的解析,即没有代码因允许空格而被不同地解释。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)