片段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。