c#lambda函数在antlr中解析
用antlr解析c#lambda表达式的语法是什么? 我试图提出一个可以成功地通过单线lambda表达方式来成功分析的,例如 Action ActioningLeline =()=> console.writeline(“非返回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;
What would be the grammar for parsing C# lambda expressions with ANTLR?
I'm trying to come up with one that would successfully parse at the very least a single-line lambda expression with immediate assignment, e.g.Action actionSingleLine = () => Console.WriteLine("Non-returning lambda");
So far I have something like this:
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;
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您发布的语法接受您的示例输入:
请注意,应删除Lexer Rule
括号:LPAR RPAR;
,因为当括号之间放置空间时正确解析。最好删除Lexer规则并在解析器规则中直接使用
lpar rpar
:The grammar you posted accepts your example input:
Note that the lexer rule
BRACKETS: LPAR RPAR;
should be removed because when a space is placed between the parenthesis:it will not be parsed correctly. Better to remove the lexer rule and use
LPAR RPAR
directly in your parser rule: