我的語言具有可參數小於或帶有參數的命令,並在「如果」的文章: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