c#lambda函数在antlr中解析

发布于 2025-01-27 06:42:25 字数 868 浏览 3 评论 0原文

用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;

And the tree I get is as follows:
And the tree I get is as follows:

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

深者入戏 2025-02-03 06:42:25

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

”在此处输入图像描述

请注意,应删除Lexer Rule 括号:LPAR RPAR;,因为当括号之间放置空间

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

时正确解析。最好删除Lexer规则并在解析器规则中直接使用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;

The grammar you posted accepts your example input:

enter image description here

Note that the lexer rule BRACKETS: LPAR RPAR; should be removed because when a space is placed between the parenthesis:

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

it will not be parsed correctly. Better to remove the lexer rule and use LPAR RPAR directly in your parser rule:

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;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文