2008-11-25 85 views
3

希望這是一個非常快速的;)我在ANTLR3中編寫了詞法分析器/解析器規範,並且針對CSharp2目標。生成的代碼工作正常,但我無法讓ANTLR將C#輸出放入命名空間。ANTLR v3 C#命名空間

語法文件的相關部分如下:

grammar MyGrammar; 

options 
{ 
    language = CSharp2; 
    output = AST; 
    ASTLabelType = CommonTree; 
} 

生成正確的命名空間,我曾嘗試:

@namespace { MyNamespace } 

@lexer::namespace { MyNamespace } 
@parser::namespace { MyNamespace } 

但兩者的這些生成錯誤,聲稱該文件沒有規則。

任何幫助表示讚賞。

回答

5

我用這對組合的詞法和語法分析器(並正確生成的命名空間):

grammar Test; 

options 
{ 
    language=CSharp2; 
} 

@lexer::namespace { 
    My.Name.Space 
} 

@parser::namespace { 
    My.Name.Space 
} 


DIGIT : '0'..'9'; 

simple : DIGIT EOF; 

所以我不知道爲什麼你的版本沒有工作 - 也許你想試試這個簡單的例子,看看如果它適合你。

4

似乎@namespace指令需要放置在tokens {}塊之後。現在所有的好...

+0

是啊,我想通了艱辛的道路。幾乎把我所有的頭髮都拉出來了。 – Charles 2011-09-08 18:19:02

+0

ANTLR真的很糟糕給出了適當的錯誤信息。 – 2012-08-12 21:36:41

2

隨着language = 'CSharp3';(和CSHARP2也一樣),你可以這樣做:

@lexer::namespace { 
    My.Name.Space 
} 

@parser::namespace { 
    My.Name.Space 
} 

產生:

} // namespace 
My.Name.Space <-- compile error here 

在詞法和語法分析器代碼的結束。如果我寫:

@lexer::namespace {My.Name.Space} 

@parser::namespace {My.Name.Space} 

它工作正常,併產生:

} // namespace My.Name.Space <-- within the line comment, no error of course