Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing 结合自顶向下和自底向上解析_Parsing - Fatal编程技术网

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

Parsing 结合自顶向下和自底向上解析,parsing,Parsing,我正在为一种类似于C#的语言创建一个解析器,并认为自顶向下和自底向上的组合是最好的。基本上,除了个别语句之外,我希望在任何地方都使用自顶向下的解析。这样做的原因是操作的顺序——使用自下而上的解析器实现它们要容易得多,而使用自上而下的解析器实现其他所有东西要容易得多 实际的实现如下:从自顶向下的解析开始,像普通的一样进行匹配。然后,在其中一个规则中,有一个标记为“自下而上”的规则Xtoken从输入lex数组中取出,自下而上(又称shift-reduce)将其“压缩”为单个token,然后将该tok

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

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

我的问题是如何得到这个号码
X
。我应该从输入令牌流中取出多少令牌来启用shift reduce?我最初的解决方案很简单——直到找到分号为止。但是,像if语句这样的东西呢?这些表达式的末尾没有分号

我会给我最初的计划举个例子,因为它可能听起来像胡言乱语。假设语法集如下所示:

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

同样,我的问题是,如何使令牌的数量减少?我怎么知道我希望所有的“3+4*2”都放在换档减速器中?

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

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