Markdown 用于标记的XText语法
我正在为标记语法编写XText语法。在标记中,h1可以用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)*
#标题写入
所以,标题可以匹配除换行符以外的任何字符
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')|-')*;