2016-10-02 63 views
1

我目前正在開發一個小DSL具有以下(shortend)語法:XTEXT驗證顯示錯行的分析錯誤

grammar mydsl with org.eclipse.xtext.common.Terminals hidden(WS, SL_COMMENT) 
generate mydsl "uri::mydsl" 

CommandSet: 
    (commands+=Command)* 
; 

Command: 
    (commandName=CommandName LBRACKET (args=ArgumentList)? RBRACKET EOL) | 
; 
terminal LBRACKET: 
    '(' 
; 
terminal RBRACKET: 
    ')' 
; 
terminal EOL: 
    ';' 
; 

正如你所看到的,我用一個分號作爲EOL分隔符,它工作得對於我來說足夠了。在eclipse中使用dsl時,內置語法驗證器會出現問題。當我錯過一個分號,驗證拋出錯了行的語法錯誤:

Error marker is shown on the next line

是否與我的語法錯誤?謝謝;)

+1

xtext中沒有EOL語義。預計會有一個Semikolon,但會找到一組關鍵字。這就是爲什麼組標記錯誤。如果您確實需要基於行的語法,則需要將WS從超文本劃分爲WS和NL –

回答

1

這是一個小的DSL鬆散地基於您的例子。基本上,我不認爲換行符已經「隱藏」了(即它們不會被解析器忽略),而只是空白。注意語法標題中的新終端MY_WSMY_NL以及修改hidden語句(我還在相關位置添加了一些註釋)。這種方法只是給你一些一般的想法,你可以試用它來實現你想要的。請注意,如果換行符不再隱藏,則需要在語法規則中考慮它們。

grammar org.xtext.example.mydsl.MyDsl 
    with org.eclipse.xtext.common.Terminals 
    hidden(MY_WS, SL_COMMENT) // ---> hide whitespaces and comments only, not linebreaks! 
generate mydsl "uri::mydsl" 

CommandSet: 
    (commands+=Command)* 
; 

CommandName: 
    name=ID 
; 

ArgumentList: 
    arguments += STRING (',' STRING)* 
; 

Command: 
    (commandName=CommandName LBRACKET (args=ArgumentList)? RBRACKET EOL); 

terminal LBRACKET: 
    '(' 
; 
terminal RBRACKET: 
    ')' 
; 
terminal EOL: 
    ';' MY_NL? // ---> now an optional linebreak at the end! 
; 

terminal MY_WS: (' '|'\t')+; // ---> whitespace characters (formerly part of WS) 
terminal MY_NL: ('\r'|'\n')+; // ---> linebreak characters (no longer hidden) 

這是一張圖像,演示了最終的行爲。

enter image description here

+0

感謝您的詳細解答。我會考慮取消隱藏LBs。 – Chris