我在使用ANTLR 4创建配置解析器时有一些问题。配置文件的语法如下:
section1{
key=value;
key=value;
}
section2{
key=value;
}
我还写了一个词法分析器/解析器:
grammar Config;
fragment IdentifierText: [A-Za-z]+[A-Za-z0-9]*;
fragment IdentifierNumber:[0-9]+'.'?[0-9]*;
fragment IdentifierBool: 'false'|'true';
Section: IdentifierText;
Key: [A-Za-z]+[A-Za-z0-9]*;
Value: IdentifierText|IdentifierNumber|IdentifierBool;
Whitespace: [tb frn]+ -> skip;
start: configs;
configs: config+;
config: section statement ;
statement: '{' assignment+ '}';
section: Section;
assignment: Key '=' Value ';';
但是如果我用这个作为例子:
Test{
debug=false;
}
得到以下错误:
line 2:0 mismatched input 'debug' expecting Key
line 2:5 mismatched input '=' expecting '{'
line 2:11 mismatched input ';' expecting '{'
有什么办法解决这个问题吗?提前感谢
您的Section
词法分析器规则与Key
无法区分。当找到匹配这些规则之一的输入时,通过选择语法中出现的第一个规则来解决歧义;在本例中是Section
。换句话说,您所定义的词法分析器不可能返回Key
令牌。
您应该通过对节和键使用单个Identifier
规则,并使用解析器规则来区分它们来解决这个问题。
section : Identifier;
key : Identifier;
Identifier : IdentifierText;