2016-01-22 4 views
1

Я пишу грамматику XText для синтаксиса Markdown. В уценке h1 может быть записано с #heading.XText грамматика для уценки

Итак, заголовок может совпадать с символом новой строки.

grammar org.example.domainmodel.DomainModel with org.eclipse.xtext.common.Terminals 

generate domainModel "http://www.example.org/domainmodel/DomainModel" 

DomainModel: 
    (elements += Element)* 
; 

Element: 
    Section1 | Section2 
; 

Section1: 
    '#' name += HEADING '\n' 
; 

Section2: 
    '##' name += HEADING '\n' 
; 

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

Но это дает ошибку, как:

The following token definitions can never be matched because prior tokens match the same input: RULE_INT

Кроме того, заголовок не может иметь каких-либо специальных символов с этим.

Что такое правильный способ написания этой грамматики?

ответ

1

вместо использования нового терминала правила КУРСОМ, использовать терминальный правило ID, который уже определен:

Section1: 
    '#' name = ID '\n' 
; 

Section2: 
    '##' name = ID '\n' 
; 
+0

Использование идентификатора не позволит использовать специальные символы в Heading. Я попытался использовать 'terminal HEADING:! ('\ N') *;' как правило терминала. Но это дает мне ошибку как «Следующие определения токенов никогда не могут быть сопоставлены, потому что предшествующие токены соответствуют одному и тому же входу: RULE_ID, RULE_INT, RULE_ANY_OTHER'. – apoorvam

+0

Удаление общих терминалов из вашей грамматики. Проблема заключается в выигрыше первого совпадения в xtext. В вашем случае HEADING можно сопоставить с правилом терминала INT или ID. Итак, из первой строки просто удалите это с org.eclipse.xtext.common.Terminals также измените правило терминала HEADING следующим образом: terminal HEADING: (('A' .. 'Z') | '_' | ('' '' '' '' '') '(' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '') | ('0' .. '9') | '-') *; – Mohsin

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