c++ - 如何构建解析树?

标签 c++ parsing context-free-grammar bnf

已找到 C++ BNF 和下一行

selection-statement:
    if ( condition ) statement
    if ( condition ) statement else statement

现在正在尝试编写解析器。需要构建解析树。输入时我有 BNF 和源文件。但我陷入了如何向我的解析器指出如果条件评估为true,那么它需要执行第一个语句,否则else block 会怎样?谢谢。

最佳答案

条件语句具有简单的递归结构。相应的递归下降解析器具有类似的简单递归结构。抽象地,内部条件解析如下:

<cond> -> if <expression> then <statement> [else <statement>]

cond :
  a = parse expression
  b = parse statement
  if is_else(token)
    then c = parse statement
         return conditional(a,b,c)
    else return conditional(a,b)

在您的示例中,条件语句包含条件 block ,其中最后一个包含 else 子句。假设标记化的输入序列具有这种形式,并且在词法分析期间检测到语法错误,则外部条件解析如下:

<conditional> -> selection_statement: {<cond>} <cond>

conditional :
  b = new block
  while (iscond(next))
    s = parse cond
    b = insert(s,b)
  return b

当然,实际的实现会更加详细和繁琐。然而,前面概述了从标记化输入序列构建具有所需形式的条件语句的解析树。

我刚刚意识到您正在谈论评估抽象语法树。评估条件语句的函数的结构与解析条件语句的函数类似。抽象地说,

cond(input) :
  a = evaluate(if_part(input))
  if is_true(a)
    then evaluate(then_part(input))
    else if(is_else(input))
           then evaluate(else_part(input))
           else return

为了确定要计算条件的哪一部分,您必须首先将条件的“if”部分计算为 bool 值。如果 bool 值为“true”,则评估条件的“then”部分。如果 bool 值为“false”,则评估条件的“else”部分。如果没有“其他”部分,就没有什么可评价的。当然,实现会比上面更详细。

关于c++ - 如何构建解析树?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7597410/

相关文章:

c++ - COM 对象 DLL 加载问题

c++ - 读取一行数字并在该行结束后停止

javascript - 我怎样才能访问 "this"内的项目

context-free-grammar - 是 { w | w <> w^R } 在字母表 {0,1} 上是一种上下文无关的语言?

c++ - 使用 Qt5 查找可执行文件

c++ - 检查 boost 定时线程是否已完成

c# - 用于检索 CSS url 函数参数的正则表达式

string - Golang 从 rune 转换为字符串

parsing - 表示逗号分隔列表的语法表达式

math - 是否存在 {0^i1^j 使得 1 <= i <= j <=2i } 的上下文无关语法?