Antlr грамматика генерирует недопустимый код C # - PullRequest
3 голосов
/ 29 марта 2012

Я пытаюсь разработать генератор кода ac #, используя ANTLR и библиотеку StringTemplate.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' ;

Это приводит к следующим строкам:код в сгенерированном методе arguments_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

1 Ответ

2 голосов
/ 30 марта 2012

Я нашел связанную проблему в списке рассылки Antlr здесь .

Решением было добавить тип ASTLabel к опциям грамматики

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