ANTLR C#在X处缺少X

ANTLR C#在X处缺少X,c#,parsing,antlr,antlr4,C#,Parsing,Antlr,Antlr4,我将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 :

我将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());
现在,当我像这样运行解析器时:

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 '.'
输出中的第一个错误特别有趣,似乎解析器无法找到应该匹配的地方。我怀疑字符串区域设置/编码有问题,但我不确定如何解决ANTLR的问题

非常感谢您的帮助

  • ID
    规则必须在
    STRUCT
    NAMESPACE
    规则(任何可能与之冲突的规则)之后,因为如果一个输入可以匹配多个标记,则首先定义的标记将获胜
  • ID
    规则可能应该是(但可能支持您的符号?)


  • 嘿,这是一个常见的陷阱,请看FWIW,支持OP的符号。