我的语言具有可参数小于或带有参数的命令,并在“如果”的文章:Antlr4词法采取错误的规则
cmd1 // parameter-less command
cmd2 a word // with parameter: "a word" - it starts with first non-WS char
if cmd3 // if, not a command, followed by parameter-less command
cmd4 if text // command with parameter: "if text"
“如果”是公认if
只有当它的第一个非WS字符串(让我们暂时忽略注释...)
这些是我的语法规则: 语法TestFlow;作为if
其次if cmd3
,而不是由cmd3
因为我需要:
// Parser Rules:
root: (lineComment | ifStat | cmd)* EOF;
lineComment : LC;
ifStat : IF;
cmd : CMD;
// Lexer Rules:
LC : '//' ~([\n\r\u2028\u2029])* -> channel(HIDDEN); // line comment
IF : 'if';
CMD : [-_a-zA-Z0-9]+ GAP LINE
| [-_a-zA-Z0-9]+
;
fragment GAP : [ \t]+;
fragment LINE : ~([\n\r\u2028\u2029])*;
但我的词法分析器识别3号线为CMD
。
我的错误是什么?如何解决它?
我最初排除了解析器规则,因为在我看来,这是一个词法分析器问题。无论如何,如果有帮助,我更新了我的问题以包含解析器规则。第二件事:'IF'规则出现在'CMD'之前,所以我认为它优先。 – Tar
如果你提到的是“The Definitive ANTLR4 Reference”这本书,那么我就是这样写的,但这不是一本很好的“入门”教程。 – Tar
'root:((ifStat)?cmd(lineComment)?)* EOF;'也不起作用。问题是'如果cmd3'出现在'commonTokenStream.getTokens()'所得的单个令牌中。所以如果它是一个单一的标记,这就是解析器从词法分析器得到的东西,它不能将它们分开。这就是为什么我认为这是一个词法分析器问题,而不是解析器 – Tar