使用antlr语法解析输入字符串

时间:2013-10-18 11:09:59

标签: antlr antlr4

语法有以下问题:

我要解析的输入字符串如下:

ruledef COMPLEX1 
    ftp command args = abc
    ftp command args = ftp
    ftp command args = cde
exit

我使用的语法:

grammar main;

/*Lexical*/
NUM : [0-9]+;
STRING : [0-9a-zA-Z]+;
WS : [ \t\r\n]+ -> skip; // Whitespace definition: skip spaces, tabs and newlines

ruledefrule: 'ruledef' STRING (ruledef_ftpcommandargsrule )* 'exit';
ruledef_ftpcommandargsrule: 'ftp' 'command' 'args' '=' STRING ;

当我通过antlr运行时,我收到错误:

line 3:23 missing STRING at 'ftp'

输入中使用的任何单词更多,例如'command'或'args'会导致同样的问题。

ftp command args = ftp
ftp command args = args
ftp command args = command

有人知道如何处理这类问题吗?

2 个答案:

答案 0 :(得分:0)

您的问题是语法中的字符串文字,例如'ruledef''exit'隐式地具有自己的标记类型,并且在所有其他字符(包括STRING之前)都被匹配。因此,STRING在其可能值集中不包含'ruledef''exit''ftp''command''args'。就像您隐式编写了以下语法一样:

grammar main;

/* Lexical */
RULEDEF : 'ruledef' ;
EXIT : 'exit' ;
FTP : 'ftp' ;
COMMAND : 'command' ;
ARGS : 'args' ;
NUM : [0-9]+ ;
STRING : [0-9a-zA-Z]+ ;
WS : [ \t\r\n]+ -> skip ; // Whitespace definition: skip spaces, tabs and newlines

ruledefrule : RULEDEF STRING ruledef_ftpcommandargsrule* EXIT ;
ruledef_ftpcommandargsrule : FTP COMMAND ARGS '=' STRING ;

上面的语法不支持您提到的输入,因为'ruledef''exit''ftp''command''args'都被标记捕获STRING之外的其他内容,因此它们在ruledef_ftpcommandargsrule中与之不匹配。解决此问题的方法是制定另一个规则,我们将其称为string,可以是STRING'ruledef''exit''ftp',{{1 }}或'command'。然后在需要该行为的地方使用该规则代替'args'

STRING

让我知道您是否希望我澄清任何事情。

答案 1 :(得分:-2)

更改词汇规则NUMSTRING的顺序。

他们的优先权取决于他们的顺序,所以先到先得。

玩ANTLR很有趣,它是一个不错的工具。