解析 AST < O(exp(n))?

2023-12-29

摘要问题描述:

在我看来,解解析意味着从 AST 创建令牌流,再次解析时会生成相等的 AST。

So parse(unparse(AST)) = AST成立。

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

该语言由一个描述上下文无关 http://en.wikipedia.org/wiki/Context-free_grammar S属性 http://en.wikipedia.org/wiki/S-attributed_grammar语法使用eBNF http://en.wikipedia.org/wiki/EBNF变体。

因此,解解析器必须通过遍历的节点找到一条有效的“路径”,其中所有语法约束都成立。这基本上意味着找到有效的分配AST http://en.wikipedia.org/wiki/Abstract_syntax_tree语法产生规则的节点。这是一个约束满足问题(CSP) http://en.wikipedia.org/wiki/Constraint_satisfaction一般来说,可以像解析一样解决回溯 http://en.wikipedia.org/wiki/Backtracking在 O(exp(n)) 中。

幸运的是,对于解析来说,这可以在 O(n3) 内完成,使用GLR http://en.wikipedia.org/wiki/GLR_parser(或者更好地限制语法)。因为AST http://en.wikipedia.org/wiki/Abstract_syntax_tree结构与语法生成规则结构非常接近,我真的很惊讶地看到运行时比解析更糟糕的实现:XText http://www.eclipse.org/Xtext/ uses ANTLR http://www.antlr.org/用于解析和回溯以进行解析。

问题

  1. 解析器和解解析器需要共享的所有内容都是上下文无关的 S 属性语法吗?还是有进一步的限制,例如关于解析技术/解析器实现?
  2. 我感觉这个问题一般来说不是 O(exp(n)) - 有天才可以帮我解决这个问题吗?
  3. 这基本上是上下文相关的语法吗?

示例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"]我知道根可以是区域,我可以将其解析为

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

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

更多信息:

  • 在 XText 中解解析 http://www.eclipse.org/Xtext//documentation.html#serialization

  • 解解析的语法约束,请参阅序列化器:具体语法验证 http://www.eclipse.org/Xtext//documentation.html#validation


问题1:不,语法本身可能还不够。举一个二义性语法的例子。如果您最终得到给定字符串的唯一最左(最右)推导(AST),您将不得不知道解析器如何消除歧义。想象一下字符串“a+b*c”和表达式“E:=E+E|E*E|...”的朴素语法。

问题3:你给出的语法例子都不是上下文相关的。产生式的左侧是单个非终结符,没有上下文。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解析 AST < O(exp(n))? 的相关文章

  • 如何将带小数点的字符串解析为双精度型?

    我想解析一个字符串 3 5 到一个双倍 然而 double Parse 3 5 产量 35 和 double Parse 3 5 System Globalization NumberStyles AllowDecimalPoint 抛出一
  • DateTimeFormatter 中的通配符

    我需要将一个字符串解析为LocalDate 该字符串看起来像31 03 2016用正则表达式术语 即 表示日期数字后可能有 0 个或多个未知字符 输入 输出示例 31xy 03 2016 gt 2016 03 31 我希望在 DateTim
  • VBA:访问 JSON

    我正在处理 VBA 投影 但不确定如何访问此 JSON 中的 id 应该将 players 设置为什么才能在循环中获取 id 我已经用更多代码更新了问题 JSON event games players id 182759 Code Pri
  • 分析 ELF 部分和符号大小的工具

    我需要一种方法来分析 ARM 的 GCC 编译器的输出文件 我正在为裸机进行编译 并且我非常关心大小 我可以用arm none eabi objdump由交叉编译器提供 但如果存在用于此任务的工具 则解析输出并不是我渴望做的事情 您知道存在
  • 是否有像 gccxml 这样的用于生成包装器的 C 标头解析器工具?

    我需要为一种新的编程语言编写一些 C 标头包装器 并且想要类似 gccxml 的东西 但不完全依赖 gcc 以及它在 Windows 系统上带来的问题 只需要读C而不是C 只要有完整的文档记录 任何格式的输出都可以 Linux Solari
  • 从 csv 中读取 pandas 数据帧,以非固定标头开始

    我有许多数据文件是由我的实验室中使用的一些相当黑客的脚本生成的 该脚本非常有趣 因为它在标头之前附加的行数因文件而异 尽管它们具有相同的格式并具有相同的标头 我正在编写一个批处理来将所有这些文件处理为数据帧 如果我不知道位置 如何让 pan
  • 为什么 Parsec 的 sepBy 停止并且不解析所有元素?

    我正在尝试解析一些逗号分隔的字符串 该字符串可能包含也可能不包含具有图像尺寸的字符串 例如 hello world 300x300 good bye world 我写了下面的小程序 import Text Parsec import qua
  • 使用 js-xlsx 解析 Excel 工作表

    我正在尝试解析用户指定的目录中的所有 Excel 文件 但js xlsx我正在使用的库似乎需要手动导航 var url test files test xlsx lt Located in the project directory var
  • java数据结构模拟数据树

    我需要帮助定义使用什么方法 我有一个 SOAP 响应 给我一个 xml 文件 我需要在屏幕上显示 3 个相关列表 当您在第一个列表中选择一个项目时 相应的选择将出现在第二个列表中 依此类推 我只对从 xml 流中提取数据后如何有效地组织数据
  • 用于冒号分隔标签的 XML 解析器? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 构建一个简单的解析器,能够使用 PyParse 解析不同的日期格式

    我正在构建一个简单的解析器 它接受如下查询 显示 fizi 从 2010 年 1 月 1 日到 2006 年 2 月 11 日的提交 到目前为止我有 class QueryParser object def parser self stmn
  • 如何使用Gson仅从Json反序列化某些特定字段?

    我有以下 JSON 字符串 channel bvmt initValues data value instrumentIds TN0007250012 TN0007500010 instruments mnemonic ADWYA marc
  • PHP解析xml文件错误

    我正在尝试使用 simpleXML 来获取数据http rates fxcm com RatesXML http rates fxcm com RatesXML Using simplexml load file 我有时会遇到错误 因为这个
  • 如何在 Antlr4 中为零参数函数编写语法

    我的函数具有参数语法 如下面的词法分析器和解析器 MyFunctionsLexer g4 lexer grammar MyFunctionsLexer FUNCTION FUNCTION NAME A Za z0 9 DOT COMMA L
  • 使用多个可选模式时顺序的重要性

    可选模式的顺序如何DateTimeFormatter影响解析操作吗 我正在运行这个程序 想知道为什么最后一行抛出异常而不是前三行 public static void main String args String p1 EEEE E dd
  • 获取 Parse Analytics 自定义仪表板

    是否可以使用 Javascript 或 REST API 从 Parse 获取应用程序分析 我想在我自己的仪表板中显示下载数量和自定义事件 不可以 您只能通过 REST API 推送 https parse com docs rest ht
  • 有没有使用 ANTLR 或类似语言实现的简单语言?

    我正在尝试构建一种简单的解释语言以用于学习目的 我读过无数关于 ANTLR 和 JavaCC 的理论和教程 但我不知道如何真正让它做一些有用的事情 我通过 把东西拆开然后重新组合起来 来学得最好 那么 是否有任何在 ANTLR 或类似工具的
  • 位图内存不足错误

    我对这个错误有疑问 我从 URL 制作网站图标解析器 我这样做是这样的 public class GrabIconsFromWebPage public static String replaceUrl String url StringB
  • Rust 编程竞赛中最快的惯用 I/O 例程?

    我的问题已部分得到解答 因此我根据从评论和其他实验中学到的知识对其进行了修改 总之 我想要一个用于编程竞赛的快速 I O 例程 其中使用单个文件解决问题 无需外部包 它应该从一个以空格分隔的标记序列中读取BufRead 标准输入或文件 标记
  • LL(1) 解析器中 FIRST 和 FOLLOW 集的用途?

    谁能向我解释一下 LL 1 语法中如何使用 FIRST 和 FOLLOW 我知道它们用于语法表构建 但我不明白如何使用 在 LL 1 解析器中 解析器的工作方式是维护一个工作空间 该工作空间最初播种到开始符号 后跟字符串结束标记 通常表示为

随机推荐