Lexer规则在没有匹配终止符符号的情况下终止



片段EXEC:('E'X'E'C');

碎片CMD:('C'M'D');

碎片BEGIN:('B'E'G'I'N');

碎片END:('E'N'D');

碎片分号:";";

ExecCommand:EXEC空白CMD空白开始空白?分号(选项{贪婪=false;}:。)*END空白执行;

开始:开始;

结束:结束;

执行:Exec;

ExecCommand规则终止对分号后面的第一个"E"的扫描,如果后面的字符不是"END",则扫描失败。扫描应仅在"END"处终止,而不应在"ELSE"或以"E"开头的任何其他字符串处终止。

扫描循环测试_LA(1)=="E",而不是匹配("END")。

Exec、Begin和End也是标记规则。ExecCommand规则是lexer语法中的第一条规则,因此它应该具有优先级。

如何生成一个规则,该规则将接受起始符号和结束符号之间的任意文本,并且在找到结束符号之前不终止?

我尝试了以下操作,但没有成功生成:ExecCommand:EXEC空白CMD空白开始空白?分号(选项{greed=false;}:~(END Whitespace EXEC))*END空白执行;

默认情况下只有一个前瞻,因此一旦找到循环后的第一个输入字符("E"),非贪婪循环就会终止。然后它尝试匹配"N"one_answers"D"(按照END规则的指示),在您的情况下会失败。试着增加前瞻性(paramater k),看看这是否有帮助。如果没有,你必须找到一种不同的方法。

附带说明:Exec和Exec完全相同(除了它们的名称),因此删除Exec(如果您在解析器中需要该lexer令牌)或Exec(如果该lexer标记仅在您的lexer中使用)。类似于END和BEGIN。

最新更新