用 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;
我得到的樹如下:

uj5u.com熱心網友回復:
您發布的語法接受您的示例輸入:

請注意,BRACKETS: LPAR RPAR;應該洗掉詞法分析器規則,因為在括號之間放置空格時:
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;
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/473571.html
上一篇:使用Yacc和Lex生成決議樹
下一篇:價格不會出現在html決議中
