ANTLR 不匹配的输入“echo 1”需要 {'<', '>', ''', '`', '"', WS, UNQUOTED}

问题描述 投票:0回答:1

我写的语法是为了解析Shell命令。

grammar cmdline;

command     : call | pipe | command ';' command;
pipe        : call '|' call
            | pipe '|' call ;

call : WS? (redirection WS?)* argument (WS? atom)* WS? ;
atom : redirection | argument ;
redirection : '<' WS? argument
            | '>' WS? argument ;
argument : (quoted | UNQUOTED)+ ;

quoted : singleQuoted
       | doubleQuoted
       | backQuoted ;
singleQuoted: '\'' NONNEWLINEANDNONSINGLEQUOTE* '\'' ;
backQuoted  : '`' NONNEWLINEANDNONBACKQUOTE* '`' ;
doubleQuoted: '"' (backQuoted | DOUBLEQUOTECONTENT)* '"' ;


// Lexer rules
WS : [ \t\r\n]+ ;
UNQUOTED : (~[ '"`\r\n|;><])+ ;
NONNEWLINEANDNONSINGLEQUOTE : (~[\n\r'])+ ;
NONNEWLINEANDNONBACKQUOTE : (~[\n\r`])+ ;
DOUBLEQUOTECONTENT : (~[\n\r"`])+ ;

我尝试解析

echo 1

它给出了错误

line 1:0 mismatched input 'echo 1' expecting {'<', '>', ''', '`', '"', WS, UNQUOTED}.

我不明白的是错误是如何发生的,因为我认为“echo”将匹配“argument”而“1”将匹配“atom”。 非常感谢。

我尝试更改词法分析器的顺序,但没有帮助。

antlr antlr4 mismatch
1个回答
0
投票

ANTLR 的词法分析器以非常可预测的方式工作:

  1. 对于每个词法分析器规则,尝试匹配尽可能多的字符
  2. 如果有 2 个(或更多)词法分析器规则匹配相同的字符,请选择第一个定义的规则

由于第 2 点,整个输入

echo 1
被标记为
NONNEWLINEANDNONSINGLEQUOTE

请注意,词法分析器不是由解析器指导的:它只是遵循我之前提到的两个步骤。

© www.soinside.com 2019 - 2024. All rights reserved.