词汇表规则终止而不匹配终止符号

时间:2014-02-07 17:26:58

标签: antlr3

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

1 个答案:

答案 0 :(得分:0)

默认情况下,只有一个前瞻,所以一旦找到该循环后的第一个输入字符('E'),非贪婪的循环就会终止。然后它尝试匹配'N'和'D'(按照END规则的指示),在你的情况下失败。尝试增加前瞻(参数k),看看是否有帮助。如果不是,你必须找到不同的方法。

作为旁注:Exec和EXEC完全相同(除了它们的名称),因此要么删除EXEC(如果在解析器中需要lexer标记),要么删除Exec(如果lexer标记专门用于词法分析器)类似于END和BEGIN。