片段 EXEC :('E''X''E''C');
片段 CMD :('C''M''D');
片段 开始:('B''E''G''我'N');
片段 结束:('E''N''D');
片段 SEMICOLON:';';
执行命令: EXEC Whitespace CMD Whitespace 开始使用WhiteSpace?分号 (options {greedy = false;} :.)* 结束空白EXEC;
开始:BEGIN;
结束:结束;
执行:执行;
ExecCommand规则终止分号后第一个'E'的扫描,如果下一个字符不是'END'则失败。扫描应仅在'END'结束,而不是'ELSE'或以'E'开头的任何其他字符串。
扫描循环测试_LA(1)=='E'而不是匹配('END')。
Exec,Begin和End也是令牌规则。 ExecCommand规则是词法分析器语法中的第一个规则,因此它应该具有优先权。
如何生成一条规则,该规则将接受起始符号和结束符号之间的任意文本,并且在找到结束符号之前不会终止?
我尝试了以下操作并且没有成功生成: 执行命令: EXEC Whitespace CMD Whitespace 开始使用WhiteSpace?分号 (options {greedy = false;}:〜(END Whitespace EXEC))* 结束空白EXEC;
答案 0 :(得分:0)
默认情况下,只有一个前瞻,所以一旦找到该循环后的第一个输入字符('E'),非贪婪的循环就会终止。然后它尝试匹配'N'和'D'(按照END规则的指示),在你的情况下失败。尝试增加前瞻(参数k),看看是否有帮助。如果不是,你必须找到不同的方法。
作为旁注:Exec和EXEC完全相同(除了它们的名称),因此要么删除EXEC(如果在解析器中需要lexer标记),要么删除Exec(如果lexer标记专门用于词法分析器)类似于END和BEGIN。