我有一个要求,其中我已将Lexer令牌写为:
IF_LEXER_TOKEN: ('I')('F') (.)* ('E')('N')('D')_('I')('F')
ANY :(options {greedy=true;}: .)* ;
但如果输入为:
IF a>b then a=b END_IF
IF c>d then c=d
在这种情况下,预期的行为是它应该使用令牌IF_LEXER_TOKEN作为第一行,ANY令牌作为第二行,而是考虑两行的ANY令牌。 请帮助。 注意:由于某些限制,我无法为其创建解析器规则 以上情况。
答案 0 :(得分:1)
不,没有这样的默认令牌。但您可以轻松创建它:
ANY: .*?;
最好是让这个非贪婪允许在输入后匹配其他令牌。顺便说一句:在词法分析器中定义一个完整的序列有几个缺点,例如:如果词法分析器规则失败,错误报告无法给您一个充分的理由。您必须明确处理所有空格。并且你放弃了这样的原则,通常在令牌之间存在多少个空格(包括换行符)并不重要。