0

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

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

我的问题/问题是如何获得这个号码X。我要从输入令牌流中取出多少个令牌以进行移位减少?我最初的解决方案很简单——把它们带到分号为止。但是,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”放入移位减速器中?

4

1 回答 1

0

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

于 2012-10-01T04:46:28.823 回答