Antlr语法生成无效的C#代码

本文关键字:代码 无效 语法 Antlr | 更新日期: 2023-09-27 18:29:18

我正在尝试使用ANTLR和StringTemplate库开发一个c#代码生成器。AntlrWorks可以在不报告任何错误的情况下生成c#解析器和lexer文件。但是,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版本

  • Antlr3.运行时3.4.1.9004
  • AntlrWorks 1.4.3

Antlr语法生成无效的C#代码

我在Antlr邮件列表中发现了一个相关问题。

解决方案是在语法选项中添加ASTLabeltype

options {
    language=CSharp3;   
    output=template;  
    ASTLabelType = StringTemplate;
}