组合自上而下和自下而上的解析



我正在为类似C#的语言创建一个解析器,并决定自上而下和自下而上的组合是最好的。基本上,除了个别语句之外,我希望在任何地方都使用自上而下的解析。这是因为操作的顺序——使用自下而上的语法实现它们要容易得多,而使用自上而下的语法实现其他所有内容也要简单得多。

这方面的实际实现如下:从自上而下的解析开始,像往常一样进行匹配。然后,在其中一条规则中,有一条规则被标记为"自下而上"。X令牌从输入lex数组中取出,用自下而上(也称为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"都放进变速箱?

我怀疑与其为"个别语句"切换策略,不如只为表达式切换策略。这样,您就不需要从流中取出固定数量的令牌;您只需将语法定义为表达式的任何内容视为一个原子单元,然后将其传递给子解析器。

最新更新