Markdown 用于标记的XText语法

Markdown 用于标记的XText语法,markdown,xtext,Markdown,Xtext,我正在为标记语法编写XText语法。在标记中,h1可以用#标题写入 所以,标题可以匹配除换行符以外的任何字符 grammar org.example.domainmodel.DomainModel with org.eclipse.xtext.common.Terminals generate domainModel "http://www.example.org/domainmodel/DomainModel" DomainModel: (elements += Element)*

我正在为标记语法编写XText语法。在标记中,h1可以用
#标题
写入

所以,标题可以匹配除换行符以外的任何字符

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') | '-')* ;
但这会产生如下错误:

以下令牌定义永远无法匹配,因为先前的令牌匹配相同的输入:RULE_INT

此外,标题不能有任何与此相关的特殊字符


编写此语法的正确方法是什么?

使用已定义的终端规则ID,而不是使用新的终端规则标题:

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

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

使用ID将不允许在标题中使用特殊字符。我尝试使用
终端标题:!('\n')*作为终端规则。但是它给了我错误,因为
以下标记定义永远无法匹配,因为先前的标记匹配相同的输入:RULE\u ID、RULE\u INT、RULE\u ANY\u OTHER
。从语法中删除公共终端。问题在于xtext第一场比赛获胜。在您的案例中,标题可以与INT或ID终端规则匹配。因此,从第一行开始,只需使用org.eclipse.xtext.common.Terminals将其删除即可。Terminals还可以修改您的标题-终端规则,如下所示:终端标题:(('A'..'Z'))|('A'..'Z')|('A''Z')|('0'..'9')|-')*;