ANTLRとStringTemplateライブラリを使用してC#コードジェネレータを開発しようとしています。 AntlrWorksは、エラーを報告することなく、C#パーサーおよびレクサーファイルを生成することができます。ただし、C#パーサーコードは無効であり、Visual Studioでコンパイルできません。無効なC#コードを生成するAntlr文法
誰でも次の文法が間違っているのを見ることができますか?
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<Object>
を入力するList <StringTemplate>
の割り当てに失敗しているのコードの次の行になります。 文字列テンプレートルールを追加する前に文法が機能します。このエラーは、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.Runtime 3.4.1.9004
- AntlrWorks 1.4.3
、感謝にASTLabeltypeを追加しました! –