Closed. This question needs details or clarity. It is not currently accepting answers. Learn more
想改进这个问题吗?添加细节并通过editing this post澄清问题。
6个月前关闭。
我想知道是否可以在yacc&lex中获取令牌的值。例如,假设我的lex文件中有这样一个定义:
";" {printf("%s ", yytext); return SEMICOLON;}

现在,可以在lex的主函数中访问SEMICOLON的值吗?

最佳答案

我想知道是否可以在yacc中获取令牌的值
&莱克斯。
总的来说,是的,当然是。
例如,假设我的lex中有这样的定义
文件:

";" {printf("%s ", yytext); return SEMICOLON;}

现在,是否可以访问main中分号的值
莱克斯的职能?
您的问题似乎基本上是关于标识符SEMICOLON的范围,但这取决于其声明的形式和位置。在你写的评论中,在你的特殊情况下,
它是在lex文件中定义的。在%%部分之后
我把它当作lex输入文件中的一部分:
%%

/* ... no rules before this */

    #define SEMICOLON 59

/* ... */

";" {printf("%s ", yytext); return SEMICOLON;}

在这种情况下,宏定义在实现扫描规则的任何代码之前被发送到生成的yylex()函数的主体中。除非显式取消定义或重新定义,否则从该点到生成的C源文件的末尾都将可见,但未指定可能存在的其他函数。还要注意,如果将其声明为变量而不是宏,则它将是scanner函数的局部变量。
这不是办法。
要对lex生成的C源全局的声明应该放在definitions部分中,放在%{%}之间。最佳做法是将这些东西放在顶部或非常接近顶部:
%{
#define SEMICOLON 59
%}

%%

/* ... */

";" {printf("%s ", yytext); return SEMICOLON;}

这将导致定义放置在文件顶部附近的顶部范围。
但是,它本身并不提供对项目中任何其他源文件的可见性。如果您使用yacc生成语法分析器来伴随基于lex的扫描器,那么惯用的方法是让yacc也生成一个包含标记标识符(默认名称:y.tab.h)的C头文件,然后将相应的#include指令放入lex输入中,而不是直接将符号放入其中。如果不使用#define但确实希望共享令牌标识符和代码,则可以手动执行类似操作。
%{
#include "y.tab.h"
%}

%%

/* ... */

";" {printf("%s ", yytext); return SEMICOLON;}

关于c - 是否有可能获得代币的值(value)? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56170827/

10-11 19:28