语法:自上而下和自下而上的区别?

2024-01-09

自上而下和自下而上语法有什么区别?举个例子就太好了。


首先,语法本身不是自上而下或自下而上的,parser是(尽管有些语法可以被一种语法解析,但不能被另一种语法解析)。

从实践的角度来看,主要区别在于大多数手写解析器是自上而下的,而更大比例的机器生成的解析器是自下而上的(当然,相反也是可能的)。

自上而下的解析器通常使用递归下降,这通常意味着类似这样的结构(使用典型的数学表达式作为示例):

expression() { term() [-+] expression }
term() { factor() [*/] term() }
factor() { operand() | '(' expression() ')' }

自下而上的解析器以相反的方向工作——递归下降解析器从完整的表达式开始,并将其分解成越来越小的部分,直到达到单个标记的级别,而自下而上的解析器从单个标记开始标记,并使用规则表来说明这些标记如何组合在一起进入表达式层次结构的越来越高的级别,直到到达顶层(上面表示为“表达式”)。

编辑:为了澄清,也许添加一个非常简单的解析器是有意义的。在这种情况下,我将执行旧的经典操作,将典型数学表达式的简化版本从中缀转换为后缀:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void expression(void);

void show(int ch) { 
    putchar(ch);
    putchar(' ');
}

int token() { 
    int ch;
    while (isspace(ch=getchar()))
        ;
    return ch;
}

void factor() { 
    int ch = token();
    if (ch == '(') {
        expression();
        ch = token();
        if (ch != ')') {
            fprintf(stderr, "Syntax error. Expected close paren, found: %c\n", ch);
            exit(EXIT_FAILURE);
        }
    }
    else
        show(ch);
}

void term() { 
    int ch;
    factor();
    ch = token();
    if (ch == '*' || ch == '/') {
        term();
        show(ch);
    }
    else
        ungetc(ch, stdin);
}

void expression() {
    int ch;
    term();
    ch = token();
    if (ch == '-' || ch=='+') {
        expression();
        show(ch);
    }
    else 
        ungetc(ch, stdin);
}

int main(int argc, char **argv) {
    expression();
    return 0;
}

请注意,这里的词法分析非常愚蠢(它基本上只接受单个字符作为标记),并且允许的表达式非常有限(只有 +-*/)。 OTOH,它足以处理如下输入:

1+2*(3+4*(5/6))

它确实产生了我认为正确的输出:

1 2 3 4 5 6 / * + * +

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

语法:自上而下和自下而上的区别? 的相关文章

  • 如何使用 python 最好地将语法复杂的文本转换为语法简单的文本?

    我想编写一个 python 程序 能够将句法复杂的句子转换为 可能是几个 不太复杂的句子 我可以在下游任务中使用它们 Example 复杂的句子 今晚我要和朋友们一起踢足球 然后再去市中心旁边的剧院看电影 具有相同内容的更简单的文本 今晚我
  • XText:使用自定义终端定义

    我对 XText 完全陌生 当您使用 XText 定义语法时 您可以指定第二个语法并使用它声明的定义here http help eclipse org helios index jsp topic org eclipse xtext do
  • 矩形内的 libgdx 动画 - 碰撞检测 - 矩形

    我正在编写一款类似于口袋妖怪风格的角色扮演游戏 自上而下的视图 我现在正在研究碰撞检测的问题 我想创建基于矩形的碰撞检测 问题是我很难在之前设置的动画周围绘制矩形 我已经在 Google 和 YouTube 上搜索了如何处理这个问题的答案
  • 解决 yacc/ocamlyacc 中的减少/减少冲突

    我正在尝试解析 ocamlyacc 中的语法 与常规 yacc 几乎相同 它支持没有运算符的函数应用程序 如 Ocaml 或 Haskell 中 以及二元和一元运算符的正常分类 我遇到了与 运算符的归约 归约冲突 该运算符可用于减法和求反
  • 来自 bison 的 ANTLR 语法

    我正在尝试将语法从 bison 翻译为 ANTLR 野牛的语法本身非常简单 但我找不到简单的方法来做到这一点 野牛语法 expr expr or expr expr and expr expr 欢迎任何提示 链接 指针 谢谢 尤利安 在AN
  • 为什么 TypeScript TypeMemberList 中的分隔符是分号而不是逗号?

    这是一个打字稿界面 interface A l x string y number 但这 类似的事情 会产生错误 interface A l x string y number gt Error expected 在规范第 37 页上 ht
  • 寻找一种非 LL(1) 的语言?

    我最近一直在研究很多非 LL 1 的语法 其中许多可以转换为 LL 1 的语法 然而 我从未见过这样的例子明确的语言这不是 LL 1 换句话说 一种语言的任何明确语法都不是 LL 1 我也不知道如果我不小心偶然发现了一种语言 我将如何证明我
  • ANSI-C 语法 - 数组声明,如 [*] 等

    ANSI C 语法来自 link http www quut com c ANSI C grammar y html给我以下数组声明规则 1 direct declarator type qualifier list assignment
  • 运算符的优先级和结合性是什么?

    C 中运算符的优先级和结合性是什么 谁定义了运算符优先级和结合性 以及它与求值顺序有何关系 https stackoverflow com q 20767745 5740428解释了这些属性如何从语法中出现 然而 我只是对所有规则的列表感兴
  • 如何引用语法中先前匹配的项目?

    我正在尝试解析 BibTeX 作者字段 并将其拆分为单独的作者 这将帮助我重写每个作者的姓名首字母 这是一个最小的例子 use v6 my str Rockhold Mark L and Yarwood RR and Selker John
  • 乔姆斯基语言类型

    我试图理解四种不同的乔姆斯基语言类型 但我发现的定义对我来说没有任何意义 我知道类型 0 是自由语法 类型 1 是上下文相关的 类型 2 是上下文无关的 而类型 3 是常规的 那么 有人可以解释一下这一点并将其放在上下文中吗 谢谢 语言是属
  • 任何能够处理左递归的 PEG 解析器? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 嗯 我知道可以重写语法来消除左递归 但这是一个非常无聊的过程 有时保持正确的关联性是非常不平凡的 是否有
  • 编写对空格敏感的解析器规则,同时从词法分析器中跳过 WS

    我在处理空白时遇到一些麻烦 在以下语法摘录中 我设置了词法分析器 以便解析器跳过空格 ENTITY VAR user resource INT DIGIT DIGIT ID LETTER LETTER DIGIT SPECIAL ENTIT
  • 语法:自上而下和自下而上的区别? (例子)

    这是来自的后续问题语法 自上而下和自下而上的区别 https stackoverflow com questions 3181960 grammar difference between a top down and bottom up 我
  • 不使用左手递归解析布尔表达式

    我正在尝试匹配这个 f some thing something else f 某物 是一个函数调用 它是一个表达式 是一个布尔运算符 别的东西 是一个字符串 也是一个表达式 所以布尔表达式应该是 expression operator e
  • ANTLR“无法启动调试器。等待连接到远程解析器超时。”

    我在 AntlrWorks 中运行的 ANTLR 语法之一抛出 无法启动调试器 等待连接到远程解析器超时 过去 此消息通常会消失 但此消息会持续存在 在搜索 ANTLR 列表时 例如http www antlr org pipermail
  • 动态规划——自上而下与自下而上

    我了解到动态规划 DP 有两种 自上而下和自下而上 In top down 您可以使用递归和记忆 在自下而上 你只需填充一个数组 一个表 此外 这两种方法都使用相同的时间复杂度 就我个人而言 我发现自上而下的方法更容易 更自然地遵循 给定的
  • ANTLR语法的迁移工具

    假设我有以下简单语法 查询 DSL grammar TestGrammar term textTerm textTerm Text T VALUE STRING T VALUE value STRING WS t r n gt skip 然
  • 编程语言语法中尾随逗号的历史

    许多编程语言允许在其语法中在列表中的最后一项后面使用尾随逗号 据说这样做是为了简化自动代码生成 这是可以理解的 作为示例 以下是 Java 中完全合法的数组初始化 JLS 10 6 数组初始值设定项 http java sun com do
  • 区分块和对象初始值设定项

    这更多的是一个理论问题 而不是一个实际问题 这是关于解析一些由大括号分隔的代码 这是两个例子对象初始值设定项 http es5 github io x11 1 5 f a 3 这是两个例子blocks http es5 github io

随机推荐

  • 将 QString 转换为 std::string

    我看过其他几篇关于将 QString 转换为 std string 的帖子 它应该很简单 但不知怎的 我收到了一个错误 我的代码使用cmake编译成VS项目 我使用的是VS Express 所以QT库没有问题 而且我编写的GUI除了这部分之
  • ionic-item 颜色和 href 不起作用

    我开始了一个基于侧菜单模板的离子项目 我试图更改侧面菜单中每个元素的背景颜色 我希望每个项目都有不同的颜色 我尝试添加离子颜色类
  • 重塑数据(更快的方法)

    我发现了一张频率表 今天计数 我必须扩展到原始值的数据框架 我能够做到这一点 但想知道是否有更快的方法使用 reshape 包 r data table 原来的表是这样的 i1 i2 i3 i4 m f 1 0 0 0 0 22 29 2
  • 从字符串中删除所有非 utf-8 符号

    我有大量的文件和解析器 我要做的就是去掉所有非 utf 8 符号并将数据放入 mongodb 中 目前我有这样的代码 with open fname r as fp for line in fp line line strip line l
  • Typeorm子查询添加选择

    我是新使用的typeorm这是我第二次感到困惑typeorm 我有以下查询 SELECT t1 a t1 b t2 a SELECT TOP 1 t1 a FROM table1 t1 WHERE t1 b t2 a ORDER BY t1
  • 将 pandas 中的时间序列重新采样为每周间隔

    如何将 pandas 中的时间序列重新采样为每周频率 其中每周从任意一天开始 我看到有一个可选的关键字库 但它只适用于短于一天的时间间隔 你可以通过锚定偏移量 http pandas pydata org pandas docs stabl
  • C++ boost 库 - 写入 ini 文件而不覆盖?

    我正在尝试使用 boost 库的 ini 解析器和属性树编写 ini 文件 该文件是分阶段写入的 我的意思是每个函数都会写入其中的一部分 最后 我只留下最后的输出 而不是写下所有内容 我在编写时使用的示例代码 property tree p
  • selenium.open() 在迭代测试中变得无响应

    我有一组必须使用不同参数执行的测试步骤 我已在 Eclipse TestNG 中编写了此脚本 由 Excel 工作表提供的参数驱动 现在 测试步骤包括设置页面的属性 然后打开另一个页面以确认该属性已设置 所以 实际上 我使用了一个简单的se
  • Spark,如何打印查询?

    我正在使用 pyspark df self sqlContext read option es resource indexes format org elasticsearch spark sql load df df filter df
  • 如何用Java管理Linux文件权限?

    是否有任何机制来获取和设置文件 目录权限 比如我想以shell的方式显示一个文件的权限 rwxr xr 使用 Java 可以做到这一点吗 我知道里面有一些方法File类来知道文件是否canExecute canRead and canWri
  • Apple-app-site-association 文件无法下载

    我已将我的 apple app site association 文件上传到我的 HTTPS Web 服务器的根目录之后 我已在 xcode 中添加了我的关联域 我已遵循 Apple 通用链接教程 SWC 拒绝重定向到 https exam
  • 为什么网格模板区域中缺少的网格区域名称会创建额外的轨道?

    我创建了一个简单的 CSS 网格 我决定不指定grid template grid template columns grid template rows特性 相反 我开始于grid template areas 并分配地区名称 to th
  • 推特引导程序中缩小尺寸?

    当 在我的浏览器中 我缩小两次 ctrl ctrl 而不是默认的 使用 ctrl 0 查看时 我喜欢使用 twitter bootstrap 的所有项目的大小 缩放会影响字体大小 响应式设计以及我想使用 bootstrap 的其他十几个重要
  • 如何允许 UWP ListView 滚动到最后一项?

    我有一个 ListView 其中包含一堆大小不规则的项目 当您滚动 ListView 时 最后一项的底部将最终位于控件的底部 您无法继续滚动 如果最后一项小于控件 我想要top最后一个项目能够滚动到控件的顶部 如果该项目比控件大 我对默认行
  • Rails 3.2.6 和通过迁移创建数据库视图

    我使用的是 Rails 3 2 6 我需要创建一个数据库 VIEW 像往常一样 我创建了一个迁移 并尝试使用执行方法来实现目标 不幸的是 迁移生成的是表 而不是视图 为什么 提前谢谢了 毛罗 UPDATE 我想要如下的东西 class Cr
  • C# 中 Delphi“shl”的等价物是什么?

    我正在基于 Delphi 转换代码 用 C 制作一个应用程序 但我发现了一个我不认识的命令 shl 我想知道是否有与 C 等效的命令 提前致谢 Shl is 左移 http www delphibasics co uk RTL asp Na
  • 如何静态检测缺失的 @Override 注释?

    在 Java 5 和 Java 6 之间 有关的规则 Override源自接口 而不是超类 的方法的注释已更改 在不允许之前 但在允许之后 然而 他们并不是required通过javac 某些 IDE 例如 eclipse 可能会针对此类缺
  • 为什么 constexpr 不是所有函数的默认值? [复制]

    这个问题在这里已经有答案了 在放宽 constexpr 的规则后 这些函数似乎可以在任何地方使用 它们也可以在常量 constexpr 和局部 可变 变量上调用 所以对我来说 这似乎只是编译器的提示 如内联 我只是继续在各处编写它 如果编译
  • ASP.NET Core 应用程序的解决方案资源管理器中的文件嵌套

    当我创建 ASP NET Core 2 0 Razor Page 模板项目时 每个 cshtml 及其 cs 文件都被拆分 我不知道为什么 几分钟前它工作正常 但我不记得我做了什么 也许是 SDK 或 Visual Studio 的设置 我
  • 语法:自上而下和自下而上的区别?

    自上而下和自下而上语法有什么区别 举个例子就太好了 首先 语法本身不是自上而下或自下而上的 parser是 尽管有些语法可以被一种语法解析 但不能被另一种语法解析 从实践的角度来看 主要区别在于大多数手写解析器是自上而下的 而更大比例的机器