如何解析带有双字符标记的行

How to parse a line with double character tokens

我正在尝试编写一个 xtext 解析器来解析一种简单的标记语言。标记使用双字符来设置文本样式。 !!用于粗体。我正在努力研究如何创建语法,特别是如何处理双字符符号。例如:

The following text !!is bold! !! but not this.

我想将其解析为以下 AST:

大家有什么好的方法吗?

我应该使用:

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 的能力,例如“\!”,这样你就可以有“\!!!”对于文字 '!'其次是 '!!'终端。这里的另一个想法是实现某种形式的递归,只将最右边的一对作为 '!!'终端。

祝你好运!