我正在使用 C# 在 ANTLR 中编写一个解析器,该语言允许使用反斜杠将一行语法拆分为多行,以指示有后续行。这进一步
我正在用 C# 编写 ANTLR 解析器,该语言允许使用反斜杠将一行语法拆分为多行,以指示有后续行。这进一步复杂化了能够向任何代码行添加注释的能力。例如,我可以写类似
If ((A = B) AND \:Check A and B
(C <> D)) :Check C and D
Add 1 Count
End
即 If 语句分为两行,但两行都有注释。换行符可以位于语法行的任意位置,因此也可以这样写
If ((A = B) \:Check A and B
AND (C <> D)) :Check C and D
Add 1 Count
End
目前,我将反斜杠视为空格并忽略它。
WS : [ ()\\\t\r\n\f;]+ -> channel(HIDDEN);
我对布尔值的定义是
// Boolean Expressions
booleanCondition : booleanExpression | '(' booleanExpression ')';
booleanExpression : expression ('='|'<>'|'<'|'>') expression ((AND|OR|'&&'|'||') booleanExpression)*;
并且有一条评论
COMMENT : ':'+ ~[:=\r\n]*;
当我解析示例代码时,它几乎正确无误,但完全错过了第一条注释,并将第二条注释解析为 ErrorNode。有没有办法在 ANTLR 中做到这一点,而无需编写某种形式的预解析器?
任何建议都将不胜感激
这似乎有效:
parse
: if_stat EOF
;
if_stat : 'If' expression command 'End';
command
: 'Add' expression ID
;
expression
: '(' expression ')'
| expression ('=' | '<>' | '<' | '>') expression
| expression ('AND' | 'OR' | '&&' | '||') expression
| ID
| NUMBER
;
LINE_CONTINUATION : '\\' COMMENT? '\r'? '\n' -> channel(HIDDEN);
COMMENT : ':' ~[\r\n]+ -> channel(HIDDEN);
WS : [ \t\r\n\f]+ -> channel(HIDDEN);
NUMBER : [0-9]+;
ID : [a-zA-Z]+;
解析如下:
If ((A = B) AND \:Check A and B
(C <> D)) :Check C and D
Add 1 Count
End
如下: