C# lambda 函数在 ANTLR 中解析

C# lambda functions parsing in ANTLR

用 ANTLR 解析 C# lambda 表达式的语法是什么? 我正在尝试想出一个至少可以成功解析单行 lambda 表达式并立即赋值的表达式,例如 Action actionSingleLine = () => Console.WriteLine("Non-returning lambda");

到目前为止我有这样的东西:

grammar Lambda;

input: line EOF;
line: type name equals lbrackets LAMBDASIGN body ';';
type: ACTION;
name: FUNCNAME;
equals: EQ;
lbrackets: BRACKETS;
body: TEXT;

fragment A : 'A';
fragment C : 'c';
fragment T : 't';
fragment I : 'i';
fragment O : 'o';
fragment N : 'n';
fragment LPAR: '(';
fragment RPAR: ')';

ACTION: 'Action' ;
EQ : '=' ;
BRACKETS: LPAR RPAR;
LAMBDASIGN: EQ '>';
FUNCNAME: ([a-z] | [A-Z])+ ;

TEXT: 'Console.WriteLine("Non-returning lambda")';

WS : (' '|'\t')+ -> skip;

而我得到的树如下:

您发布的语法接受您的示例输入:

请注意,词法分析器规则 BRACKETS: LPAR RPAR; 应该被删除,因为当 space 放在括号之间时:

Action actionSingleLine = ( ) => Console.WriteLine("Non-returning lambda");

它不会被正确解析。最好删除词法分析器规则并直接在解析器规则中使用 LPAR RPAR

grammar Lambda;

input: line EOF;
line: type name equals LPAR RPAR LAMBDASIGN body ';';
type: ACTION;
name: FUNCNAME;
equals: EQ;
body: TEXT;

LPAR: '(';
RPAR: ')';

ACTION: 'Action' ;
EQ : '=' ;
LAMBDASIGN: EQ '>';
FUNCNAME: ([a-z] | [A-Z])+ ;

TEXT: 'Console.WriteLine("Non-returning lambda")';

WS : (' '|'\t')+ -> skip;