0

我有一个简单的语法设置,如下所示:

语法测试
   规则线
      (形容词/非形容词)* {
         定义内容
             元素.map{|e| e.内容 }
         结尾
      }
   结尾
   规则形容词
      (“好”/“坏”/“优秀”){
          定义内容
              [:形容词,文本值]
          结尾
      }
   结尾
   规则 not_adjective
      !形容词{
          定义内容
              [:not_adjective, text_value]
          结尾
      }
   结尾
结尾

假设我的输入是“这是一个好球。让我们使用它”。这给出了一个错误,我现在没有提到它,因为我想先了解为什么它是错误的理论。那么,如何创建规则 not_adjective 以便它匹配规则形容词不匹配的任何内容?一般来说,我如何编写“不”匹配另一个命名规则的 I 规则(特别是在 Treetop 中)?

4

2 回答 2

1

Treetop 是一个解析器生成器,它从称为Parsing Expression Grammars 或 PEG的一类特殊语法中生成解析器。
的操作解释!expression是如果expression失败则成功,如果成功则失败expression但它不消耗任何输入
要匹配规则expression不匹配的任何内容,请使用运算符(匹配任何内容)与否定运算符一起使用以避免某些“单词”:

( !expression . )* ie. "match anything BUT expression"
于 2010-03-09T20:08:29.463 回答
1

先前的答案对于 OP 的问题是不正确的,因为它将匹配任何单个字符的序列直到任何形容词。因此,如果您看到字符串 xyzgood,它将匹配 xyz,并且以下规则将匹配“好”部分作为形容词。同样,OP 的形容词规则会将“badge”的前三个字符匹配为形容词“bad”,这不是他们想要的。

相反,形容词规则应该是这样的:

rule adjective
  a:("good" / "bad" / "excellent") ![a-z] {
    def content
      [:adjective, a.text_value]
    end
  }
end

和这样的 not_adjective 规则:

rule not_adjective
  !adjective w:([a-z]+) {
    def content
      [:not_adjective, w.text_value]
    end
  }
end

包括根据需要处理大写、连字符、撇号等。当然,您还需要处理空白。

于 2015-05-06T01:59:48.540 回答