ANTLR C# 在 X 处缺少 X
ANTLR C# missing X at X
我将 ANTLR 与 C# 结合使用,为类似 C 的结构创建一个简单的解析器。 运行时间版本是4.7。
语法如下所示:
structDef : STRUCT ID OPENBLOCK (fieldDef)+ CLOSEBLOCK ;
fieldDef : (namespaceQualifier)+ ID ID SEMICOLON ;
namespaceQualifier : ID DOT ;
/*
* Lexer Rules
*/
ID : [a-zA-Z_] [a-zA-Z0-9_]* ;
STRUCT : 'struct' ;
NAMESPACE : 'namespace' ;
OPENBLOCK : '{' ;
CLOSEBLOCK : '}' ;
DOT : '.' ;
SEMICOLON : ';' ;
WHITESPACE : (' '|'\t')+ -> skip;
现在,当我 运行 解析器像这样时:
test = "struct Stest { type name; }"
var lexer = new OdefGrammarLexer(new AntlrInputStream(test));
var tokenStream = new CommonTokenStream(lexer);
var parser = new OdefGrammarParser(tokenStream);
var ctx = parser.structDef();
Console.Out.WriteLine(ctx.ToString());
我得到一个错误输出:
line 1:0 missing 'struct' at 'struct'
line 1:7 extraneous input 'Stest' expecting '{'
line 1:20 missing '.' at 'name'
line 1:24 mismatched input ';' expecting '.'
输出中的第一个错误特别有趣,似乎解析器未能在应有的位置找到匹配项。我怀疑字符串 locale/encoding 有问题,但我不确定如何为 ANTLR 解决这个问题。
非常感谢任何帮助。
ID
规则必须在 STRUCT
和 NAMESPACE
规则之后(任何可能与之冲突的规则),因为如果输入可以匹配多个标记,则第一个定义的将获胜
ID
规则可能应该是(但也许支持您的符号?):
ID : ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A' .. 'Z' | '0'..'9' | '_')* ;
我将 ANTLR 与 C# 结合使用,为类似 C 的结构创建一个简单的解析器。 运行时间版本是4.7。 语法如下所示:
structDef : STRUCT ID OPENBLOCK (fieldDef)+ CLOSEBLOCK ;
fieldDef : (namespaceQualifier)+ ID ID SEMICOLON ;
namespaceQualifier : ID DOT ;
/*
* Lexer Rules
*/
ID : [a-zA-Z_] [a-zA-Z0-9_]* ;
STRUCT : 'struct' ;
NAMESPACE : 'namespace' ;
OPENBLOCK : '{' ;
CLOSEBLOCK : '}' ;
DOT : '.' ;
SEMICOLON : ';' ;
WHITESPACE : (' '|'\t')+ -> skip;
现在,当我 运行 解析器像这样时:
test = "struct Stest { type name; }"
var lexer = new OdefGrammarLexer(new AntlrInputStream(test));
var tokenStream = new CommonTokenStream(lexer);
var parser = new OdefGrammarParser(tokenStream);
var ctx = parser.structDef();
Console.Out.WriteLine(ctx.ToString());
我得到一个错误输出:
line 1:0 missing 'struct' at 'struct'
line 1:7 extraneous input 'Stest' expecting '{'
line 1:20 missing '.' at 'name'
line 1:24 mismatched input ';' expecting '.'
输出中的第一个错误特别有趣,似乎解析器未能在应有的位置找到匹配项。我怀疑字符串 locale/encoding 有问题,但我不确定如何为 ANTLR 解决这个问题。
非常感谢任何帮助。
ID
规则必须在STRUCT
和NAMESPACE
规则之后(任何可能与之冲突的规则),因为如果输入可以匹配多个标记,则第一个定义的将获胜ID
规则可能应该是(但也许支持您的符号?):ID : ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A' .. 'Z' | '0'..'9' | '_')* ;