语法有以下问题:
我要解析的输入字符串如下:
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
有人知道如何处理这类问题吗?
答案 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)
更改词汇规则NUM
和STRING
的顺序。
他们的优先权取决于他们的顺序,所以先到先得。
玩ANTLR很有趣,它是一个不错的工具。