我正在尝试使用ANTLR和StringTemplate库开发一个c#代码生成器。 AntlrWorks可以生成c#解析器和词法分析器文件,而不会报告任何错误。但是,c#解析器代码无效,无法在visual studio中编译。
任何人都可以看到以下语法有什么问题吗?
grammar StrucadShape;
options {
language=CSharp3 ;
output=template;
}
@header {using System;}
@lexer::header {using System;}
@lexer::members {const int HIDDEN = Hidden;}
/*------------------------------------------------------------------
* PARSER RULES
*------------------------------------------------------------------*/
public shapedef: parameters_def
-> class_temp( parameters={$parameters_def.st} )
;
parameters_def : (PARAMETERS LPAREN (p+=param) (COMMA (p+=param))* RPAREN )
-> parameter_list(params={$p})
;
param : IDENTIFIER ->Parameter_decl(p={$IDENTIFIER.text});
/*------------------------------------------------------------------
* LEXER RULES
*------------------------------------------------------------------*/
fragment EOL:'\r'|'\n'|'\r\n' ;
WS : (' '
| '\t'
| EOL)
{ $channel = HIDDEN; } ;
PARAMETERS: 'PARAMETERS';
COMMA : ',' ;
LPAREN : '(' ;
RPAREN : ')' ;
fragment LETTER :('A'..'Z' | 'a'..'z');
IDENTIFIER: LETTER (LETTER|DIGIT)*;
INTEGER : (DIGIT)+ ;
FLOAT : (DIGIT)+'.'(DIGIT)+;
fragment DIGIT : '0'..'9' ;
这会在生成的parameters_def()方法
中产生以下代码行List<object> list_p = null;
...snipped some code
if (list_p==null) list_p=new List<StringTemplate>();
将List <StringTemplate>
分配到List<Object>
类型时失败了。
在添加字符串模板规则之前,语法有效。当我在StringTemplate库中添加列表处理所需的(p+=param)
语法时,会引入错误。
我将添加我的StringTemplate文件以保证完整性,但我认为这不会导致错误,因为它在运行时才加载。
group StrucadShape;
Parameter_decl(p)::= "public double <p> { get; set; }"
parameter_list(params) ::=
<<
start expressions
<params; separator="\n">
end
>>
class_temp( parameters)::=
<<
public class name
{
<parameters; separator="\n>
}
>>
示例输入字符串PARAMETERS( D,B,T)
Antlr版本
答案 0 :(得分:2)
我在Antlr邮件列表here上找到了相关问题。
解决方案是将ASTLabeltype添加到语法选项
options {
language=CSharp3;
output=template;
ASTLabelType = StringTemplate;
}