gpt4 book ai didi

bison - 使 bison 使用除开始规则以外的规则开始解析

转载 作者:行者123 更新时间:2023-12-02 06:36:06 27 4
gpt4 key购买 nike

目前我正在研究一个源到源编译器,我已经编写了一个野牛解析器,可以正确地为输入创建 AST。我现在需要对语法树进行多次转换,因此我需要向树中插入许多节点。

我可以手动创建所有要添加到语法树中的结构体/联合体,但这似乎是 非常很多工作。

我创建一个字符串会容易得多,我希望这个字符串由我已经拥有的解析器解析。然后解析器应该返回这个字符串的树,我可以将它插入到我的原始语法树中。

不幸的是,字符串不能用我的解析器的开始规则解析,因为它必须由子规则解析(例如,我的解析器解析包含语句的函数列表,字符串是单个语句)。

如何让野牛解析一个字符串,从与开始规则不同的规则开始?

提前致谢!

最佳答案

有一个简单的 hack,在 bison FAQ. 中有描述。 .

基本上,对于您希望能够使用的每个非终端,您创建一个伪 token ,然后创建一个“元启动”非终端来选择您要使用的终端:

%token START_PROGRAM
%token START_STATEMENT
%token START_EXPRESSION

%start meta_start

%%

meta_start: START_PROGRAM program
| START_STATEMENT statement
| START_EXPRESSION expression
;

(在每个产生式的操作中,您可以将 $2 的值保存在您的调用者可以获取的某个地方。)

现在你只需要安排你的词法分析器提供正确的开始 token 。您可以通过使用纯解析器和纯词法分析器并通过共享数据结构传递消息来做到这一点。那将是最好的方法,但出于本答案的目的,我将仅展示如何使用全局变量来执行此操作,因为原理是相同的:
extern int start_token;

// If all your start non-terminals produce a value of the same type, possibly a union
// type, you could arrange to return it instead of the error report.

int yyparse(int start) {
// I left out the code to cause the lexer to scan a given string.
start_token = start;
return real_yyparse();
}

int yylex() {
int rv = start_token;
if (start_token)
start_token = 0;
else
rv = real_yylex();
return rv;
}

关于bison - 使 bison 使用除开始规则以外的规则开始解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18594960/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com