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

标签 c# antlr

我正在尝试使用 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> . 在我添加字符串模板规则之前语法有效。当我添加 (p+=param) 时引入错误StringTemplate 库中列表处理所需的语法。

为了完整性,我将添加我的 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.Runtime 3.4.1.9004
  • AntlrWorks 1.4.3

最佳答案

我在 Antlr 邮件列表上发现了一个相关问题 here .

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

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

关于c# - Antlr 语法生成无效的 C# 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9923639/

相关文章:

c# - 在 C# 中使用 winrar.exe 提取存档并检测是否发生任何错误

antlr - token 识别错误: antlr

antlr - 如何使用 ANTLR 区分保留字和变量?

java - ANTLR3 语法吃整数

c# - 如何在 LinkBut​​ton 单击事件上启动电子邮件客户端?

c# - 列表框中项目的对齐

javascript - knockout : how to filter by genre AND by mediatype

c# - Nullable-如何在 C# 中的 DateTime 类型中仅比较日期而不比较时间?

ios - ANTLR v4 + Xcode/objC/iOS?

java - 使用 ANTLR "need concept"解析 Java 代码