结合自顶向下和自底向上解析

时间:2012-09-30 15:01:21

标签: parsing

我正在为类似于C#的语言创建一个解析器,并决定自上而下和自下而上的组合最好。基本上,我想在除个别语句之外的任何地方使用自顶向下解析。这样做的原因是操作顺序 - 用自下而上的方式实现它们要容易得多,用自上而下的解析器实现其他所有东西要容易得多。

实际的实现如下:从自上而下的解析开始,匹配正常。然后,在其中一个规则中,有一个标记为“自下而上”的规则。从输入lex数组中取出X个标记,用自下而上(aka shift-reduce)“压缩”成一个标记,并将该标记放入自上而下的匹配中。自上而下继续进行其余的比赛。

我的问题/疑问是如何获得此号码X。我从输入令牌流中取出多少令牌以进行shift-reduce打开?我最初的解决方案很简单 - 拿它们直到达到分号。但是,if语句呢?这些表达式的末尾没有分号。

我将举例说明我原来的计划,因为它可能听起来像是胡言乱语。说语法集如下:

(top-down) statement ::= <expression> ";"
(bottom-up) expression =
    multiplication ::= <number> "*" <number>
    addition ::= <number> "+" <number>

然后会像这样减少:

3 + 4 * 2 ;
((bottom-up) 3 + 4 * 2) ;
    3 + 4 * 2
    3 + multiplication
    addition
addition ;
statement

我的问题是,如何让令牌数量减少?我如何知道我希望将所有“3 + 4 * 2”放入减速器?

1 个答案:

答案 0 :(得分:0)

我怀疑,不是为“个别陈述”切换策略,而是仅为表达式做更好的事情。这样你就不需要从流中取出固定数量的令牌了;你只需将你的语法定义为表达式的任何东西视为一个原子单元,然后传递给你的子解析器。