che*_*rui 10 compiler-construction gcc bison flex-lexer
我几乎在网上搜索了所有资料.但我仍然困惑为什么lexer无法识别yylval.
情况就是这样:我已经定义了一堆ADT node.h并实现它们node.c,我的目的是在正确存储这些结构后生成AST.但我被困在野牛档案中.
首先,我改%union到union YYSTYPE {...};和typedef union YYSTYPE YYSTYPE;,我不知道为什么我要做到这一点,在网上发布一些其他文件,似乎一道很好地工作%uinion.
然后,我被yylval事情困扰了.我已经做了bison -d一些事情,并且已经检查过了parser.c(我已经指定了bison输出),所以我认为extern YYSTYPE yylval;应该可行.但事实并非如此.所以我想知道是否还有另一种解决yylval未申报问题的方法.
我只使用两种类型的YYSTYPE结构,int并且char *,我可以YYSYTPE将AST 的联合和结构分开吗?这意味着,非终结符将没有关联类型.你们有其他想法吗?
小智 5
如果它对其他人有帮助,我发现(OpenBSD lex v2.5.4 + yacc)包括
extern YYSTYPE yylval;
Run Code Online (Sandbox Code Playgroud)
在我的lex源代码不足以防止'yylval undefined'问题,即使y.tab.c文件包含:
#ifndef YYSTYPE
typedef int YYSTYPE;
#endif
Run Code Online (Sandbox Code Playgroud)
我通过在lex源中放置一个明确的定义来解决这个问题:
#define YYSTYPE int
extern YYSTYPE yyltype
Run Code Online (Sandbox Code Playgroud)
但是,我不清楚以这种方式定义是否会传播到yacc源文件的语言环境...
你应该使用%union。您不需要键入定义联合。
您可以使用 bison -d 获取带有任何声明(例如终端、非终端和标记的类型)的头文件。例子:
bison -d parser.y 将产生两个文件,parser.tab.c 和 parser.tab.h。您可以将后一个文件包含到您的词法分析器文件中,这样它就会知道您的%token定义。该文件还包括 yylval 及其类型的定义。
您不应该分离联合,因为您很可能会扩展它并需要它来在词法分析器和解析器之间进行通信。
| 归档时间: |
|
| 查看次数: |
11194 次 |
| 最近记录: |