【发布时间】:2014-07-31 17:45:25
【问题描述】:
我在处理空白时遇到了一些麻烦。在以下语法摘录中,我设置了词法分析器,以便解析器跳过空格:
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 和 @ 987654325@ 单独从我的代码中提取,而不是将它们挤回到整个令牌 ENTITY_ID 中。
有什么想法吗?
基本上任何让我直接访问ENTITY_VAR 和ID 的解决方案都适合我,无论是将ENTITY_ID 作为词法分析器规则还是将其移至解析器。
【问题讨论】:
-
也许lexical modes 可以帮忙?一旦你偶然发现
'__',你会切换不跳过空格的模式? -
感谢您的建议。所以,如果我理解正确,我会编写一个解析器规则
entityVar,这样当与'__'匹配时,它会切换到禁用WS词法分析器规则的模式? -
操作,我的意思是
entityId,而不是Var -
Lexer 模式不依赖于解析器规则。每当词法分析器匹配
'__'时,它都会切换模式,无论是否存在实际使用'__'标记的解析器规则。 -
您能否提供一些示例输入代码以及您想要的内容?