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

时间:2015-10-29 06:20:16

标签: java compiler-construction antlr xtext

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

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

我想将其解析为以下AST:

  • 线
    • 线
      • 文字“以下文字”
      • BoldText“很大胆!”
      • 文字“但不是这个。”

有没有人有任何好方法?

我应该使用:

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)+,我不知道如何摆脱它?

1 个答案:

答案 0 :(得分:1)

我建议将终端定义为' !!' (第一种情况)然而'!'然后是另一个'!' (第二种情况)也适用于此用例。

如果你有" !!!"你的解析器应该如何表现?连续?在这种情况下,它很可能会将前两个" !!"并将第三个留作字面意思!'。我建议添加逃脱的能力!例如," \!",所以你可以拥有" \ !!!"对于一个字面的'!'接着是' !!'终奌站。这里的另一个想法是实现某种形式的递归,只采取最右边的一对作为' !!'终端

祝你好运!