我无法弄清楚如何用野牛编写解析器。
为了将变量插入到我的符号表中,以便我可以进行一些类型检查和其他废话,我需要变量名称和类型。
我特别关注这些方面:
%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”。尝试将内容插入到符号表中时,我得到了同样的错误。
这样做的好方法是什么?
提前感谢您的帮助。
答案 0 :(得分:1)
在语法方面,一切看起来都不错。看起来您的问题实际上是C的一个问题:检查SPush
函数的签名,它似乎是一个函数,其第二个参数是void*
,而不是tokentype
(这是ID
)的声明类型。