我正在使用ANTLR4并尝试解析字符串和数字中的.“"。我希望能够解析以下两个语句,但只能成功解析其中一个,而不能同时解析两个:
str = "sentence. more.";
num = 5.5;
字符串
我正在使用以下语法文件:
grammar TestGrammar;
// Parser rules
rule : statement*;
statement : assignmentStatement;
assignmentStatement : identifier '=' numberLiteral ';'
| identifier '=' stringLiteral ';'
;
numberLiteral : MINUS? NUM* DOT? NUM+;
stringLiteral : '"' string '"';
string : (SYMBOL | CHAR | NUM)+;
identifier : UNDERSCORE? (CHAR | NUM)+;
// Lexer rules
WS : (' ' | '\t' | '\r' | '\n')+ -> skip;
CHAR : [a-zA-Z];
NUM : [0-9];
SYMBOL : [<>#=&|!(){}.\-:;];
MINUS : '-';
UNDERSCORE : '_';
DOT : '.';
型
DOT和SYMBOL词法分析器规则之间存在重叠。目前,它能够解析字符串,但不能解析数字。如果我更改规则顺序,使DOT在SYMBOL之前,它就可以解析数字,但不能解析字符串。
我试过直接用“.”吗?在numberLiteral规则中,并移除DOT规则,这仍然会在比对字串时造成问题。我还尝试过将SYMBOL规则更改为如下所示的内容:
SYMBOL : [<>#=&|!(){}DOT\-:;];
型
可能我的语法错误,但无法正确解析字符串。如何更改我的语法文件,使其能够成功解析这两种语法?我也有类似的问题与减号。谢谢你,谢谢
2条答案
按热度按时间trnvg8h31#
您需要创建Number和String Literals作为标记(如果您想命名子部分,可以使用fragment,但要理解,您只能获得
STRING
或NUMBER
标记。不存在为片段匹配生成的令牌,并且令牌不具有作为组件的令牌,它们是解析树上的叶节点。试试这个:
字符串
flvtvl502#
数字是离散的,因此适合在词法分析器中匹配。未在数字中使用的
Dot
s将作为DOT
s发出。字符串
PS:Antlr Grammars Repo是一个寻找例子的好地方。