稀释AST< O(EXP(n))的?

时间:2012-08-12 01:10:48

标签: parsing antlr abstract-syntax-tree xtext constraint-satisfaction

摘要问题说明:

我看到它的方式,unparsing意味着从AST创建一个令牌流,当再次解析时产生一个相等的AST。

所以parse(unparse(AST)) = AST成立。

这等于找到一个生成相同AST的有效解析树。

语言由context free S-attributed语法使用eBNF变体描述。

因此,解析者必须通过所有语法约束所包含的遍历节点找到有效的“路径”。这基本上意味着找到AST节点到语法生成规则的有效分配。这通常是constraint satisfaction problem (CSP),可以通过O(exp(n))中的backtracking解析,如解析。

幸运的是,对于解析,这可以使用GLR在O(n³)中完成(或者更好地限制语法)。因为AST结构非常接近语法生成规则结构,所以我真的很惊讶看到运行时比解析更糟糕的实现:XText使用ANTLR进行解析和回溯以进行解析。

问题

  1. 是一个无上下文的S属性语法,解析器和解析器需要共享的所有东西,还是有进一步的约束,例如:解析技术/解析器实现?
  2. 我觉得这个问题一般不是O(exp(n)) - 有些天才可以帮我解决这个问题吗?
  3. 这基本上是一个上下文敏感的语法吗?
  4. 例1:

    Area    returns AnyObject   -> Pedestrian | Highway
    Highway returns AnyObject   -> "Foo" Car
    Pedestrian  returns AnyObject   -> "Bar" Bike
    Car     returns Vehicle     -> anyObjectInstance.name="Car"
    Bike    returns Vehicle     -> anyObjectInstance.name="Bike" 
    

    所以,如果我有一个包含

    的AST

    AnyObject -> AnyObject -> Vehicle [name="Car"]我知道root可以是Area,我可以将其解析为

    Area    -> Highway  -> Car
    

    因此(公路|行人)决定取决于子树决策。当一片叶子乍一看是几种类型中的一种时,问题会变得更糟,但是必须是一个特定的叶片,以便稍后形成一个有效的路径。

    例2:

    因此,如果我有S属性规则返回无类型对象,只需指定一些属性,例如

    A -> B C   {Obj, Obj}
    X -> Y Z   {Obj, Obj}
    B -> "somekeyword"  {0}
    Y -> "otherkeyword" {0}
    C -> "C" {C}
    Z -> "Z" {Z}
    

    因此,如果AST包含

       Obj
      /  \
    "0"  "C"
    

    我可以将其解析为

       A
      / \
     B   C
    

    我可以将“C”解析为C.

    在遍历AST时,我可以从语法生成的所有约束都满足规则A和X,直到我点击“C”。这意味着

    A -> B | C 
    B -> "map"  {MagicNumber_42}
    C -> "foreach" {MagicNumber_42}
    

    树的两种解决方案

         Obj
          |
     MagicNumber_42
    

    是有效的,并且认为它们具有相同的语义,例如。句法糖。

    更多信息:

1 个答案:

答案 0 :(得分:1)

问题1:不,语法本身可能还不够。以一个含糊不清的语法为例。如果您最终得到了给定字符串的唯一最左侧(最右侧)派生(AST),您将不知何故必须知道解析器如何消除歧义。只要想一下字符串'a + b * c'和表达式'E:= E + E | E * E | ...'的天真语法。

问题3:您提供的语法示例都不是上下文敏感的。制作的左手边是单个非终端,没有背景。