我写的语法是为了解析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 的词法分析器以非常可预测的方式工作:
由于第 2 点,整个输入
echo 1
被标记为 NONNEWLINEANDNONSINGLEQUOTE
。
请注意,词法分析器不是由解析器指导的:它只是遵循我之前提到的两个步骤。