C 有可能获得代币的价值吗?
我想知道是否有可能在yacc&lex中获得令牌的值。例如,假设我的lex文件中有这样一个定义:C 有可能获得代币的价值吗?,c,yacc,lex,C,Yacc,Lex,我想知道是否有可能在yacc&lex中获得令牌的值。例如,假设我的lex文件中有这样一个定义: ";" {printf("%s ", yytext); return SEMICOLON;} 现在,是否可以在lex的主函数中访问分号的值 我想知道是否有可能在yacc中获得令牌的值 &莱克斯 一般来说,是的,当然是这样 例如,假设我在我的lex中有这样一个定义 文件: 现在,是否可以访问main中分号的值 法的功能 您的问题似乎基本上是关于标识符分号的范围,但这取决于其声明的形式和位置。你在评论中
";" {printf("%s ", yytext); return SEMICOLON;}
现在,是否可以在lex的主函数中访问分号的值
我想知道是否有可能在yacc中获得令牌的值
&莱克斯
一般来说,是的,当然是这样
例如,假设我在我的lex中有这样一个定义
文件:
现在,是否可以访问main中分号的值
法的功能
您的问题似乎基本上是关于标识符分号的范围,但这取决于其声明的形式和位置。你在评论中写道,在你的特殊情况下
它是在lex文件中定义的。在%%
部分之后
我将其视为lex输入文件中的以下内容:
%%
/* ... no rules before this */
#define SEMICOLON 59
/* ... */
";" {printf("%s ", yytext); return SEMICOLON;}
在这种情况下,在任何代码实现扫描规则之前,宏定义被发送到生成的yylex()
函数的主体中。除非显式取消定义或重新定义,否则从该点到生成的C源文件的末尾,它都是可见的,但未指定还有哪些其他函数。还请注意,如果将其声明为变量而不是宏,则它将是scanner函数的局部变量
这不是做这件事的方法
对于lex生成的C源代码来说,声明应该是全局的,应该放在定义部分,包含在%{
和%}
之间。最佳做法是将这些东西放在顶部或非常接近顶部:
%{
#define SEMICOLON 59
%}
%%
/* ... */
";" {printf("%s ", yytext); return SEMICOLON;}
这将导致将定义放置在顶部范围,靠近文件顶部
但是,这本身并不能提供项目中任何其他源文件的可见性。如果您正在使用yacc
生成一个解析器,与基于lex
的扫描仪一起使用,那么惯用的做法是让yacc
也生成一个包含令牌标识符的C头文件(默认名称:y.tab.h
),然后将相应的#include
指令放入lex
输入中,而不是直接在那里定义符号。如果您不使用yacc
,但希望共享令牌标识符和代码,则可以手动执行类似操作
%{
#include "y.tab.h"
%}
%%
/* ... */
";" {printf("%s ", yytext); return SEMICOLON;}
我想知道是否有可能在yacc中获得令牌的值
&莱克斯
一般来说,是的,当然是这样
例如,假设我在我的lex中有这样一个定义
文件:
现在,是否可以访问main中分号的值
法的功能
您的问题似乎基本上是关于标识符分号的范围,但这取决于其声明的形式和位置。你在评论中写道,在你的特殊情况下
它是在lex文件中定义的。在%%
部分之后
我将其视为lex输入文件中的以下内容:
%%
/* ... no rules before this */
#define SEMICOLON 59
/* ... */
";" {printf("%s ", yytext); return SEMICOLON;}
在这种情况下,在任何代码实现扫描规则之前,宏定义被发送到生成的yylex()
函数的主体中。除非显式取消定义或重新定义,否则从该点到生成的C源文件的末尾,它都是可见的,但未指定还有哪些其他函数。还请注意,如果将其声明为变量而不是宏,则它将是scanner函数的局部变量
这不是做这件事的方法
对于lex生成的C源代码来说,声明应该是全局的,应该放在定义部分,包含在%{
和%}
之间。最佳做法是将这些东西放在顶部或非常接近顶部:
%{
#define SEMICOLON 59
%}
%%
/* ... */
";" {printf("%s ", yytext); return SEMICOLON;}
这将导致将定义放置在顶部范围,靠近文件顶部
但是,这本身并不能提供项目中任何其他源文件的可见性。如果您正在使用yacc
生成一个解析器,与基于lex
的扫描仪一起使用,那么惯用的做法是让yacc
也生成一个包含令牌标识符的C头文件(默认名称:y.tab.h
),然后将相应的#include
指令放入lex
输入中,而不是直接在那里定义符号。如果您不使用yacc
,但希望共享令牌标识符和代码,则可以手动执行类似操作
%{
#include "y.tab.h"
%}
%%
/* ... */
";" {printf("%s ", yytext); return SEMICOLON;}
可能它取决于分号的定义方式。因为它很可能是通过一个#define
来定义的,所以它应该在任何地方都可以访问。@1201程序是什么意思?它是在lex文件中定义的。在%%
部分之后,您请求Bison(Yacc)创建一个带有标记号的头(Yacc-d grammar.y
)。您可以在Flex(Lex)源代码中包含该头。@Huzo:token通常在Yacc文件中定义(通常以.y
结尾的内容命名),执行Yacc
命令(或类似bison
)会生成一个C头文件(名称以.h
结尾)。在C源文件中,您可以使用#include
包含该头文件,这将使令牌定义在C源代码中可用。如果这不是你的安排,你应该展示一个。它取决于分号的定义方式。因为它很可能是通过一个#define
来定义的,所以它应该在任何地方都可以访问。@1201程序是什么意思?它是在lex文件中定义的。在%%
部分之后,您请求Bison(Yacc)创建一个带有标记号的头(Yacc-d grammar.y
)。您可以在Flex(Lex)源代码中包含该头。@Huzo:token通常在Yacc文件中定义(通常以结尾的内容命名)