如何解析带有双字符标记的行
How to parse a line with double character tokens
我正在尝试编写一个 xtext 解析器来解析一种简单的标记语言。标记使用双字符来设置文本样式。 !!用于粗体。我正在努力研究如何创建语法,特别是如何处理双字符符号。例如:
The following text !!is bold! !! but not this.
我想将其解析为以下 AST:
- 行
- 行
- 文字"The following text "
- 粗体文本 "is bold! "
- 文字“但不是这个。”
大家有什么好的方法吗?
我应该使用:
terminal BOLD: '!!'
或
Bold : '!' '!'
我在想我必须使用第二条规则。为了处理这个问题,我必须有单字符终端,然后对所有内容使用解析器规则。
我现在的语法是:
grammar org.xtext.example.mydsl.MyDsl
import "http://www.eclipse.org/emf/2002/Ecore" as ecore
generate myDsl "http://www.xtext.org/example/mydsl/MyDsl"
Lines:
lines+=Line*
;
Line:
{Line} content+=(PlainText|BoldText)*
NL
;
PlainText:
text = Text
;
Text returns ecore::EString:
(CHAR|WS)+
;
BoldText:
BOLD
{BoldText} text += PlainText*
BOLD
;
terminal BOLD: '!!';
terminal WS: (' ' | '\t')+;
terminal NL: '\r'? '\n';
terminal CHAR: !(' '|'\t'|'\r'|'\n');
但这会收到警告,因为它可以匹配 Text 中 PlainText OR (CHAR|WS)+ 的重复,我不知道如何摆脱它?
我建议将终端定义为“!!” (第一种情况),但是 '!'接着是另一个 '!' (第二种情况)也应该适用于这个用例。
如果你有“!!!”,你的解析器应该如何表现?连续?在这种情况下,它很可能会将前两个“!!”组合在一起。并将第三个保留为文字“!”。我建议添加转义 !s 的能力,例如“\!”,这样你就可以有“\!!!”对于文字 '!'其次是 '!!'终端。这里的另一个想法是实现某种形式的递归,只将最右边的一对作为 '!!'终端。
祝你好运!
我正在尝试编写一个 xtext 解析器来解析一种简单的标记语言。标记使用双字符来设置文本样式。 !!用于粗体。我正在努力研究如何创建语法,特别是如何处理双字符符号。例如:
The following text !!is bold! !! but not this.
我想将其解析为以下 AST:
- 行
- 行
- 文字"The following text "
- 粗体文本 "is bold! "
- 文字“但不是这个。”
- 行
大家有什么好的方法吗?
我应该使用:
terminal BOLD: '!!'
或
Bold : '!' '!'
我在想我必须使用第二条规则。为了处理这个问题,我必须有单字符终端,然后对所有内容使用解析器规则。
我现在的语法是:
grammar org.xtext.example.mydsl.MyDsl
import "http://www.eclipse.org/emf/2002/Ecore" as ecore
generate myDsl "http://www.xtext.org/example/mydsl/MyDsl"
Lines:
lines+=Line*
;
Line:
{Line} content+=(PlainText|BoldText)*
NL
;
PlainText:
text = Text
;
Text returns ecore::EString:
(CHAR|WS)+
;
BoldText:
BOLD
{BoldText} text += PlainText*
BOLD
;
terminal BOLD: '!!';
terminal WS: (' ' | '\t')+;
terminal NL: '\r'? '\n';
terminal CHAR: !(' '|'\t'|'\r'|'\n');
但这会收到警告,因为它可以匹配 Text 中 PlainText OR (CHAR|WS)+ 的重复,我不知道如何摆脱它?
我建议将终端定义为“!!” (第一种情况),但是 '!'接着是另一个 '!' (第二种情况)也应该适用于这个用例。
如果你有“!!!”,你的解析器应该如何表现?连续?在这种情况下,它很可能会将前两个“!!”组合在一起。并将第三个保留为文字“!”。我建议添加转义 !s 的能力,例如“\!”,这样你就可以有“\!!!”对于文字 '!'其次是 '!!'终端。这里的另一个想法是实现某种形式的递归,只将最右边的一对作为 '!!'终端。
祝你好运!