2012-03-29 2 views
3

Я пытаюсь разработать генератор кода C#, используя ANTLR и библиотеку StringTemplate. AntlrWorks может генерировать файлы парсера C# и файлы lexer без сообщений о каких-либо ошибках. Однако код парсера C# недействителен и не может быть скомпилирован в visual studio.Antlr грамматика генерирует недопустимый код C#

Может ли кто-нибудь увидеть, что не так со следующей грамматикой?

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

ответ

2

Я нашел смежный вопрос на Список рассылки Antlr here.

Решение было добавить ASTLabeltype к вариантам грамматики

+0

Круто, спасибо за размещение решение! –

Смежные вопросы