我正在为类似于 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”放入移位减速器中?