gpt4 book ai didi

c - 在 bison/yacc 中处理变量名列表

转载 作者:太空宇宙 更新时间:2023-11-04 03:56:31 25 4
gpt4 key购买 nike

我不知道如何用 bison 编写解析器。

为了将变量插入到我的符号表中,以便我可以进行一些类型检查和其他无意义的事情,我需要变量名和类型。

我特别关注这些行:

%union {tokentype token;
char *type;
sPtr names; //stack pointer
}
<%token definitions>
%token <token> ID ICONST
%type <type> stype type
%type <names> IDlist

vardcl : IDlist ':' type
;

IDlist : IDlist ',' ID
| ID
;

type : ARRAY '[' integer_constant RANGE integer_constant ']' OF stype { $$ = $8 }
| stype { $$ = $1 }
;

stype : INT { $$ = "INT" }
| BOOLEAN { $$ = "BOOLEAN" }
;

如果我的语法是这样的:

vardcl          : ID ':' type
;

我可以做类似的事情:

vardcl          : ID ':' type { SymbolTableInsert($1, $3); }
;

但是我的语法是这样的:

vardcl          : IDlist ':' type
;

IDlist : IDlist ',' ID
| ID
;

所以我试图将每个 ID 放入一个数据结构中(我已经为符号表使用了一个堆栈,所以我想我也可以使用它)但是我不断收到关于 $arguments 和我不确定我什至插入了我需要的一切:

IDlist          : IDlist ',' ID { $$ = SCreate(CompareStrings); SPush($$, $3); }
| ID { $$ = SCreate(CompareStrings); SPush($$, $1);
;

我收到错误“SPush 的参数 2 的类型不兼容,预期为 void * 不是 tokentype”。尝试将内容插入我的符号表时,我也遇到了同样的错误。

执行此操作的好方法是什么?

在此先感谢您的帮助。

最佳答案

在语法方面,一切看起来都不错。看起来你的问题实际上是 C 的问题:检查你的 SPush 函数的签名,它似乎是一个第二个参数是 void* 的函数,而不是 tokentype(ID 的声明类型)。

关于c - 在 bison/yacc 中处理变量名列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16028880/

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