我尝试获取bison中token的值,但是好像一次获取了不止一个token。 这是我的弹性代码:
%{
#include <stdio.h>
#include "y.tab.h"
//YYSTYPE yylval;
%}
semicolon [;]
var [a-c]
digit [0-9]+
string [a-zA-Z]+
%%
Counter {yylval = yytext; return VAR;}
[a-zA-Z0-9]+ { yylval = yytext; return STRING;}
....
这是我的 Bison 代码:
%{
#define YYSTYPE char *
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int limit;
int input;
int count=0;
char a[20];
char message[200];
%}
%token DIGIT VAR OPENPAR CLOSEPAR PETIK
%token WRITELN DO FOR BEGINKEY END TO EQUAL
%token SEMICOLON VARKEY COLON TYPE STRING READLN
%start program
%%
program: dlist slist {printf("L3: HALT");}
;
dlist: /* nothing */
| decl dlist
;
decl: VARKEY VAR COLON TYPE SEMICOLON
;
slist: stmt
| stmt slist
| BEGINKEY FOR VAR EQUAL DIGIT TO DIGIT DO slist END
{
printf("\nBeginFunc\n");
printf("t%d = %d;\n",count,$5);
printf("%s = t%d\n",$3,count);
....
所以问题是当我输入 writeln('forloop'); 时。该程序应该只获取forloop,但它获取了forloop'); 但是当我像这样逐行输入时: for循环 ' ) ; 它只显示forloop 什么可能导致这个问题?
最佳答案
在将它传递给 bison
之前,您必须处理或复制 yytext
。 bison
将从扫描仪请求前瞻 token ,这些 token 将覆盖任何 yytext
。
对于标识符,通常使用 strdup
或等效的 ANSI-C。如果语言只有一个命名空间,或者命名空间在扫描器中已经可以区分,那么习惯上直接在扫描器中构建符号表并只传递一些标识符。
对于数字,通常会确定数字的值并将其传递给解析器。
上面的一些术语您可能不熟悉,但值得您研究一下它们的含义。
关于c - 在 flex 和 bison 中获取超出预期的字符串标记值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16300326/