如何构建解析树?

时间:2011-09-29 12:35:46

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

找到了C ++ BNF并有下一行

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

现在尝试编写解析器。需要构建解析树。输入时我有BNF和源文件。但我仍然坚持如何指出我的解析器如果 condition 评估为true,那么它需要执行第一个语句否则阻止?感谢。

3 个答案:

答案 0 :(得分:1)

首先,您需要区分编译器的常规传递:

  1. lexing,即识别单词和删除评论,
  2. 解析,即将线性输入流结构化为抽象语法树,以及
  3. 评估或代码生成。
  4. 先做第一件事,然后你会理解其余的事情。看看前两个步骤的boost :: spirit。

答案 1 :(得分:1)

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

<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)

在您的示例中,条件语句包含条件块,其中最后一个条件包含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”部分评估为布尔值。如果布尔值为“true”,则评估条件的“then”部分。如果布尔值为“false”,则评估条件的“else”部分。如果没有“其他”部分,则无需评估。当然,实施将比上述更详细。

答案 2 :(得分:0)

有多种程序采用BNF语法并输出正确的解析器:http://en.wikipedia.org/wiki/Backus-Naur_form#Software_using_BNF

如果您正在编写自己的解析器,则会有excellent overview online here