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

使用antlr语法分析输入字符串,antlr,antlr4,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 de

我的语法有以下问题:

我将要分析的输入字符串如下所示:

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

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

更改词汇规则和字符串的顺序

他们的优先顺序决定,所以先到先得


ANTLR是一个很好的工具,让您玩得开心。

您的问题是语法中的字符串文本,如“ruledef”和“exit”隐式地有自己的标记类型,并且在所有其他内容之前(包括在字符串之前)进行匹配。因此,字符串的可能值集中不包含“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”都是由字符串以外的标记捕获的,因此它们在ruledefftpcommandargsrule中不匹配。解决这个问题的方法是创建另一个规则,我们称之为string,它可以是string、'ruledef'、'exit'、'ftp'、'command'或'args'。然后在需要行为的地方使用该规则代替字符串:

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 ;
string : STRING | 'ruledef' | 'exit' | 'ftp' | 'command' | 'args' ;

如果您想让我澄清任何事情,请告诉我。

您好。谢谢这不是解决问题的办法。改变顺序并不能解决问题。这里的剪贴只是更大语法的一小部分。