我试图使用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
}
答案 0 :(得分:1)
问题是block
由'{' statement_list? '}'
或pp_directive
组成。在这种特定情况下,它会选择第一个,因为它看到的第一个标记是{
(在if
条件之后)。现在,预计可能会看到statement_list?
,然后看到}
,但它找到的是#if TEST
,pp_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 {
}