解析antlr4中的C#预处理程序

时间:2015-05-26 21:33:12

标签: c# antlr4

我试图使用ANTLR4解析C#预处理器而不是忽略它们。我使用了这里提到的语法:https://github.com/antlr/grammars-v4/tree/master/csharp

这是我的补充(现在我只关注pp_conditional):

pp_directive
    : Pp_declaration
    | pp_conditional
    | Pp_line
    | Pp_diagnostic
    | Pp_region
    | Pp_pragma
    ; 

pp_conditional
    : pp_if_section (pp_elif_section | pp_else_section | pp_conditional)*  pp_endif
;


pp_if_section:
  SHARP 'if' conditional_or_expression statement_list
;

pp_elif_section: 
   SHARP 'elif' conditional_or_expression statement_list
;

pp_else_section:
   SHARP 'else' (statement_list | pp_if_section)
;

pp_endif:
    SHARP 'endif'
;

我在这里添加了条目:

block 
    : OPEN_BRACE statement_list? CLOSE_BRACE
    | pp_directive
    ;

我收到了这个错误:

line 19:0 mismatched input '#if TEST\n' expecting '}'

当我使用以下测试用例时:

if (!IsPostBack){
 #if TEST 
   ltrBuild.Text = "**TEST**"; 

#else 
   ltrBuild.Text = "**LIVE**";

#endif
}

1 个答案:

答案 0 :(得分:1)

问题是block'{' statement_list? '}'pp_directive组成。在这种特定情况下,它会选择第一个,因为它看到的第一个标记是{(在if条件之后)。现在,预计可能会看到statement_list?,然后看到},但它找到的是#if TESTpp_directive

我们该怎么办?让你的pp_directive声明。由于我们知道statement_list: statement+;,我们会搜索statement并向其添加pp_directive

statement 
    : labeled_statement
    | declaration_statement
    | embedded_statement
    | pp_directive
    ;

它应该工作正常。但是,我们还必须查看您的block: ... | pp_directive是否应该删除,应该是。我会让你找出原因,但这是一个含糊不清的测试用例:

if (!IsPostBack)
    #pragma X
else {
}