【问题标题】:How to parse a line with double character tokens如何解析带有双字符标记的行
【发布时间】:2015-10-29 06:20:16
【问题描述】:

我正在尝试编写一个 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)+ 的重复,我不知道如何摆脱它?

【问题讨论】:

  • 我忘了说我需要捕获空白并在新行上分割。

标签: java compiler-construction antlr xtext


【解决方案1】:

我建议将终端定义为“!!” (第一种情况),但是 '!'后面跟着另一个“!” (第二种情况)也应该在这个用例中工作。

在你有“!!!”的情况下你的解析器应该如何表现?连续?在这种情况下,它很可能会将前两个“!!”分组。并将第三个保留为文字“!”。我建议添加转义 !s 的能力,例如“\!”,这样你就可以拥有“\!!!”对于文字'!'其次是 '!!'终端。这里的另一个想法是实现某种形式的递归,仅将最右边的对作为“!!”终端。

祝你好运!

【讨论】:

  • 感谢您的回答。好点,我不确定这种行为,可能与降价中的一样 *****bold me***
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 2016-01-19
  • 1970-01-01
  • 2017-01-31
  • 2013-03-22
  • 2016-12-12
相关资源
最近更新 更多