2014-01-04 3 views
2

Я хотел бы создать Markdown как Xtext DSL. Но кажется сложным разобрать заголовки вроде # Introduction, потому что у него нет определенного символа конца. Есть ли способ выразить это? Или это вообще (а не только ограничение Xtext) невозможно?Markdown as Xtext DSL

Вот мой XText:

grammar markdown.Markdown with org.eclipse.xtext.common.Terminals 

generate markdown "http://www.Markdown.markdown" 

Model: 
    entities+=Entity*; 

Entity: 
    Section | Subsection | Paragraph 
; 

Section: 
    '#' 
    content+=TextPart 
    '::' 
; 

Subsection: 
    '##' 
    content+=TextPart 
    '::' 
; 

Paragraph: 
    content+=TextPart 
; 

TextPart: 
    text=Text 
; 

Text: 
     (ID | WS | SINGLE_NL | MULTI_NL | ANY_OTHER | '\\[' | '\\]' | ',' | "-" | '\\:' | '\\%' | '\\#' | '\\##')+; 


terminal ID: 
     ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '_' | '0'..'9')*; 

terminal SL_COMMENT: 
     '%%' !('\n' | '\r')* ('\r'? '\n'); 

terminal MULTI_NL: 
     '\r'? '\n' (/*(' ' | '\t')**/ '\r'? '\n')+; 

terminal SINGLE_NL: 
     '\r'? '\n'; 

terminal WS: 
     ' ' | '\t'; 

terminal ANY_OTHER: 
     .; 

Клеммы с Xdoc. С этой грамматике правила это возможно:

# Introduction :: 

Lorem ipsum. 

## Other chapter :: 

Lorem ipsum. 

Но я хотел бы Markdown так:

# Introduction 

Lorem ipsum. 

## Other chapter 

Lorem ipsum. 

Поэтому нам нужно \n вместо ::, как окончание. Но возможно ли это? Кроме того, antlr создает предупреждения, вызванные правилами терминала. Но эти предупреждения не делают при создании Xdoc.xtext. В чем моя ошибка?

warning(200): ../markdown/src-gen/markdown/parser/antlr/internal/InternalMarkdown.g:436:1: Decision can match input such as "'-'" using multiple alternatives: 9, 14 
As a result, alternative(s) 14 were disabled for that input 
warning(200): ../markdown/src-gen/markdown/parser/antlr/internal/InternalMarkdown.g:436:1: Decision can match input such as "'\\['" using multiple alternatives: 6, 14 
As a result, alternative(s) 14 were disabled for that input 
... 

ответ

3

Однолинейный комментарий клемма на базовых языках XText очень похожа:

terminal SL_COMMENT: '//' !('\n'|'\r')* ('\r'? '\n')?; 

Основная идея заключается в следующем: символ может содержать любые символы, которые не конец строки символов.

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