语法:自上而下和自下而上的区别? (例子)

2024-02-15

这是来自的后续问题语法:自上而下和自下而上的区别? https://stackoverflow.com/questions/3181960/grammar-difference-between-a-top-down-and-bottom-up

我从这个问题中了解到:

  • 语法本身不是自上而下或自下而上的,解析器是
  • 有些语法可以被一种语法解析,但另一种则不能解析
  • (thanks 杰瑞·柯芬 https://stackoverflow.com/questions/3181960/grammar-difference-between-a-top-down-and-bottom-up/3182046#3182046

因此对于这个语法(所有可能的数学公式):

    E -> E T E
    E -> (E)
    E -> D

    T -> + | - | * | /

    D -> 0
    D -> L G

    G -> G G    
    G -> 0 | L

    L -> 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 

自上而下和自下而上的解析器可以读取它吗?

你能说这是自上而下的语法还是自下而上的语法(或两者都不是)?


我问这个问题是因为我有一个作业问题要问:

“为包含所有......的语言编写自上而下和自下而上的语法”(不同的问题)

我不确定这是否正确,因为似乎不存在自上而下和自下而上的语法。有人能澄清一下吗?


这种语法很愚蠢,因为它将词法分析和解析合而为一。但好吧,这是一个学术例子。

自下而上和自上而下的问题在于,它们具有特殊的极端情况,很难用正常的第一眼来实现。我可能认为你应该检查它是否有任何问题并更改语法。

为了理解你的语法,我写了一个正确的 EBNF

expr:
    expr op expr |
    '(' expr ')' |
    number;

op:
    '+' |
    '-' |
    '*' |
    '/';

number:
    '0' |
    digit digits;

digits:
    '0' |
    digit |
    digits digits;

digit:
    '1' | 
    '2' | 
    '3' | 
    '4' | 
    '5' | 
    '6' | 
    '7' | 
    '8' | 
    '9'; 

我特别不喜欢这个规则digits: digits digits。目前尚不清楚第一个数字从哪里开始,第二个数字从哪里结束。我会将规则实施为

digits:
    '0' |
    digit |
    digits digit;

另一个问题是number: '0' | digit digits;这与digits: '0' and digits: digit;。事实上,这是重复的。我会将规则更改为(删除数字):

number:
    '0' |
    digit |
    digit zero_digits;

zero_digits:
    zero_digit |
    zero_digits zero_digit;

zero_digit:
    '0' |
    digit;

这使得语法 LR1(左递归,向前看)和上下文无关。这是您通常会提供给解析器生成器(例如 bison)的内容。由于 bison 是自下而上的,因此这是自下而上解析器的有效输入。

对于自上而下的方法,至少对于递归体面来说,左递归有点问题。如果您愿意,可以使用回滚,但对于这些,您需要 RR1(右递归前瞻)语法。为此,请交换递归:

zero_digits:
    zero_digit |
    zero_digit zero_digits;

我不确定这是否能回答你的问题。我认为这个问题的表述很糟糕并且具有误导性;我以编写解析器为生......

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

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

  • 如何在 vscode 中正确注入语法扩展(使其有效)?

    我很难扩展 shell 脚本语法 因为它只突出显示 bash 内置命令 我想基本上突出显示 shell 命令 而不仅仅是内置命令 为此 我尝试通过注入来扩展语法 但这没有很好的记录 因此无论我在做什么 我都会一遍又一遍地遇到同样的问题 如果
  • Bison/Yacc 语法中的无意串联

    我正在尝试 lex 和 yacc 并遇到了一个奇怪的问题 但我认为最好在详细说明问题之前向您展示我的代码 这是我的词法分析器 include
  • 为什么 C++ 编译器在行后而不是在行上给出错误?

    今天在工作中 当我与编译器发生另一起家庭事务时 这个问题突然出现在我的脑海中 尽管我的小指很浅 由于我在工作中按分号 我还是在一场比赛之前错过了一个 if陈述 显然 这导致了编译错误 错误 C2143 语法错误 缺少 在 如果 之前 所以我
  • 为什么这个简单的语法会有移位/归约冲突?

    token
  • 解决 yacc/ocamlyacc 中的减少/减少冲突

    我正在尝试解析 ocamlyacc 中的语法 与常规 yacc 几乎相同 它支持没有运算符的函数应用程序 如 Ocaml 或 Haskell 中 以及二元和一元运算符的正常分类 我遇到了与 运算符的归约 归约冲突 该运算符可用于减法和求反
  • 背包0-1路径重建(拿哪些物品)[重复]

    这个问题在这里已经有答案了 我知道如何用动态规划方法解决背包 0 1 问题 但我很难弄清楚要拿哪些物品而不影响 O N C N 个物品 C 容量 的复杂性 有什么想法 我更喜欢自下而上的方法 假设现在您将结果存储在数组中bool a whe
  • ANTLR 4 令牌规则匹配任何字符,直到遇到 XYZ

    我想要一个标记规则 它会吞噬所有字符 直到它到达字符XYZ 因此 如果输入是这样的 helloXYZ 那么令牌规则应该返回这个令牌 hello 如果输入是这样的 Blah Blah XYZ 那么令牌规则应该返回这个令牌 Blah Blah
  • Python 中与语法、标记、词干和词义消歧有关的一些 NLP 内容

    背景 TLDR 为了完成而提供 寻求有关奇怪需求的最佳解决方案的建议 我是一名大学四年级的 文学 学生 只有我自己的编程指导 我对Python有足够的能力 所以我不会在实现我找到的解决方案 大多数时候 并在它们的基础上进行开发时遇到麻烦 但
  • 用于计算类数的部分语法

    我需要计算正确的 C 源文件中的类数量 我写了以下语法 grammar CSharpClassGrammar options language CSharp2 parser namespace CSharpClassGrammar Gene
  • 如何将当前执行状态压入堆栈以便稍后继续执行?

    想象一个简单的语法 a ab c 其内容为 a 或 ab 后跟 c 解析树看起来像这样 and or c a ab 现在给它这个输入 abc 我们首先沿着树的左侧向下遍历 并匹配 a 然后返回上一层 由于 a 匹配 or 也为真 因此继续处
  • 在哪里可以找到 Perl 编程语言的形式语法?

    我知道 Perl 语法是不明确的 并且它的消歧是不平凡的 有时涉及在编译阶段执行代码 http www modernperlbooks com mt 2009 08 on parsing perl 5 html 无论如何 Perl 是否有正
  • 如何在action方法中获取匹配的token参数值?

    如果我的语法中有这样的内容 grammar G token tab indent Int level Using just level would require to have the same effect so use a code
  • NLTK 中解析的英语语法

    是否有现成的英语语法可供我加载并在 NLTK 中使用 我搜索了使用 NLTK 进行解析的示例 但似乎我必须在解析句子之前手动指定语法 多谢 你可以看一下pyStat解析器 https github com emilmont pyStatPa
  • Rust 的词法语法是规则的、上下文无关的还是上下文相关的?

    大多数编程语言的词法语法都相当缺乏表达力 无法快速对其进行词法分析 我不确定 Rust 的词法语法属于什么类别 大多数看起来很正常 可能除了原始字符串文字 https doc rust lang org reference tokens h
  • 验证英语文本中“a”和“an”的正确使用 - Python [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想创建一个程序 从文件中读取文本并指出 a 和 an 何时使用不正确 据我所知 一般规则是当下一个单词以元音开头时使用 an 但还应
  • Perl 6 规则中 .parse 锚点还是 :sigspace 首先?

    我有两个问题 我表现出的行为是否正确 如果是 它是否记录在某处 我在玩语法TOP方法 宣布为rule 它意味着字符串的开头和结尾锚点以及 sigspace grammar Number rule TOP d my strings 137 1
  • 语法的替代版本无法按照我的意愿工作

    这段代码解析 string如我所愿 usr bin env raku my string q to END aaa bbb this has trailing spaces which I want to keep kjkjsdf kjkd
  • 解析树和语法信息

    有谁知道在哪里可以找到好的在线资源以及如何制作语法和解析树的示例 最好是介绍材料 信息是 n00b 友好的 我自己在 Google 上没有找到任何好的信息 Edit 我正在考虑理论 而不是特定的解析器软件 网上没有 不过也许你应该看看编译器
  • 动态规划——自上而下与自下而上

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

    我正在尝试通过实现一个小型正则表达式解析器来学习秒差距 在 BNF 中 我的语法类似于 EXP EXP LIT EXP LIT 我尝试在 Haskell 中实现这一点 expr try star lt gt try litE lt gt l

随机推荐