2015-09-19 33 views
1

問題:我想在我的語法中有一個執行塊,它允許任何有效的java行(或者只是任何行,這也可以)在其範圍內:如何在Xtext語法中允許一行Java代碼

Execution: 
    {Execution} 'execute {' 
    (lines+=(JavaLine | Referral))* 
    '}' 
; 

Referral: 
    inReferal | outReferal 
; 

inReferal: 
    name=ID '<=' port=ID 
; 

outReferal: 
    name=ID '=>' port=ID 
; 

JavaLine: 
    {JavaLine}(words+=ID)* ';' // this doesn't fit quite its needs, no . - { etc allowed 
;  

這是語法的相關部分,我將如何創建JavaLine以獲得任何行?

紅利問題:我有其他規則,如OutPort或Parameter,我怎麼能阻止它們在我的執行塊中使用? (我得到的語法高亮了我的Java行中的關鍵字)

Model: 
    stages+=Stage*; 

Stage: 
    'stage' name=ID (('implements' interfaces=List)? & ('extends' extension=ID)?) '{' 
     lines+=StageItems* 
    '}'; 

List: items+=ID (',' items+=ID)*; 

StageItems: 
    InPort | OutPort | Parameter | Execution 
; 

Parameter: 
    'param' type=ID name=ID 
; 

InPort: 
    'in' type=ID name=ID 
; 

OutPort: 
    'out' type=ID name=ID 
;  

回答

0

我結束了使用此:

Execution: 
    content=JAVA_LINE 
; 

terminal JAVA_LINE: 
    'execute' 
    '{'->'}' // TODO: this doesn't fit quite its needs 
; 

代碼生成,我不得不刪除從內容串一些內容,但一切工作正常。

0

第一個問題:

一種可能性將它定義爲字符串而不是表的話(用ID)。您可以稍後在生成過程中將該字符串轉換爲Java代碼。

JavaLine: 
    {JavaLine}(words=STRING)* ';' 
; 

第二個問題:

如果你用我的問題一個建議,第二個問題應該是過時的。

1

Java代碼沒有按行組織。從技術上講,幾乎任何行都可以作爲Java源代碼接受,因爲您可以將/* */多行註釋放在Java源代碼中。

如果從概念prescind,您可以解析使用Java Grammar (Java7)Java Grammar (Java8) Java源代碼 - 這是一個相當大的工作。

如果您只實現語法(see here),那麼它可能更容易 - 它表示Java中的可執行塊。這是少工作。

如果你想只允許一個班輪Java代碼(保留概念),你可以專注於聲明水平,採摘允許的聲明類型(例如,無子類定義,沒有標籤等)

+0

感謝您的回答。我可以以某種方式導入現有的Java語法嗎?我唯一想做的就是完全複製執行塊中的內容。 –