C 有可能获得代币的价值吗?

C 有可能获得代币的价值吗?,c,yacc,lex,C,Yacc,Lex,我想知道是否有可能在yacc&lex中获得令牌的值。例如,假设我的lex文件中有这样一个定义: ";" {printf("%s ", yytext); return SEMICOLON;} 现在,是否可以在lex的主函数中访问分号的值 我想知道是否有可能在yacc中获得令牌的值 &莱克斯 一般来说,是的,当然是这样 例如,假设我在我的lex中有这样一个定义 文件: 现在,是否可以访问main中分号的值 法的功能 您的问题似乎基本上是关于标识符分号的范围,但这取决于其声明的形式和位置。你在评论中

我想知道是否有可能在yacc&lex中获得令牌的值。例如,假设我的lex文件中有这样一个定义:

";" {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文件中定义(通常以
结尾的内容命名)