Я пишу грамматику 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
Кроме того, заголовок не может иметь каких-либо специальных символов с этим.
Что такое правильный способ написания этой грамматики?
Использование идентификатора не позволит использовать специальные символы в Heading. Я попытался использовать 'terminal HEADING:! ('\ N') *;' как правило терминала. Но это дает мне ошибку как «Следующие определения токенов никогда не могут быть сопоставлены, потому что предшествующие токены соответствуют одному и тому же входу: RULE_ID, RULE_INT, RULE_ANY_OTHER'. – apoorvam
Удаление общих терминалов из вашей грамматики. Проблема заключается в выигрыше первого совпадения в xtext. В вашем случае HEADING можно сопоставить с правилом терминала INT или ID. Итак, из первой строки просто удалите это с org.eclipse.xtext.common.Terminals также измените правило терминала HEADING следующим образом: terminal HEADING: (('A' .. 'Z') | '_' | ('' '' '' '' '') '(' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '') | ('0' .. '9') | '-') *; – Mohsin