Bison Parser:令牌字符串值返回 NULL
Bison Parser: Token string value returning NULL
我的问题很简单,但我找不到解决方案。
我正在为 LUA 语言构建一个简单的解析器(没有很多东西,主要是赋值、函数和迭代结构),当我尝试获取标记的字符串值时,它 returns 空。
我可以很好地获取数字的 INT 值。
示例:
输入密码:
a = 1
词汇阶段的输出:
TOKEN_ID TOKEN_ASSIGN TOKEN_NUMBER
当我尝试获取 TOKEN_ID 和 TOKEN_NUMBER 的值时,TOKEN_ID = null,TOKEN_NUMBER = 1
这是所有标记的定义,稍后我会突出显示我的问题的重要部分。
%{
#include <cstdio>
#include <iostream>
#include "ast.h"
#include "potatoCodeGen.h"
using namespace std;
// stuff from flex that bison needs to know about:
extern "C" int yylex();
extern "C" int yyparse();
extern "C" FILE *yyin;
extern int line_num;
no *ast;
void yyerror(const char *s);
%}
%union {
int ival;
const char *sval;
no *ast;
}
//Keywords
%token TOKEN_AND
%token TOKEN_BREAK
%token TOKEN_DO
%token TOKEN_ELSE
%token TOKEN_ELSEIF
%token TOKEN_END
%token TOKEN_FALSE
%token TOKEN_FOR
%token TOKEN_FUNCTION
%token TOKEN_IF
%token TOKEN_IN
%token TOKEN_LOCAL
%token TOKEN_NIL
%token TOKEN_NOT
%token TOKEN_OR
%token TOKEN_REPEAT
%token TOKEN_RETURN
%token TOKEN_THEN
%token TOKEN_TRUE
%token TOKEN_UNTIL
%token TOKEN_WHILE
//Valued Terminals
%token <sval> TOKEN_STRING
%token <ival> TOKEN_NUMBER
%token <sval> TOKEN_ID
//Operator/pontuation Terminals
%token TOKEN_LPAREN
%token TOKEN_RPAREN
%token TOKEN_PLUS
%token TOKEN_MULTIPLY
%token TOKEN_MINUS
%token TOKEN_DIV
%token TOKEN_MOD
%token TOKEN_HAT
%token TOKEN_CROSS
%token TOKEN_EQUAL
%token TOKEN_AEQUAL
%token TOKEN_NEQUAL
%token TOKEN_LEQUAL
%token TOKEN_GEQUAL
%token TOKEN_LESSER
%token TOKEN_GREATER
%token TOKEN_ASSIGN
%token TOKEN_LKEY
%token TOKEN_RKEY
%token TOKEN_LBOX
%token TOKEN_RBOX
%token TOKEN_SEMICOLON
%token TOKEN_TWOPOINTS
%token TOKEN_COLON
%token TOKEN_POINT
%token TOKEN_DOUBLEPOINT
%token TOKEN_ETC
%start Input
%type <ast> bloco
%type <ast> comando
%type <ast> exp
%type <ast> nomedafuncao
%type <ast> corpodafuncao
%type <ast> chamadadefuncao
%type <ast> args
%type <ast> listaexp
%type <ast> listapares
%type <sval> opbin
%%
///*//Debug Area
//prototype: createNode (char *type, no *down, no *next);
Input:
bloco {printf("programa finalizado \n"); ast = ;}
;
bloco:
comando {printf("bloco de um comando encontrado \n"); $$ = createNode("bloco", , NULL);}
| comando bloco {printf("varios comandos encontrados \n"); $$ = createNode("bloco", , ); }
;
//Comandos principais e coisas auxiliares
comando:
TOKEN_ID TOKEN_ASSIGN exp {printf("assignemt de id %s para comando\n", ); $$ = createNode("assign", createId(), );}
/*
*>>Here comes the rest of the grammar and the main of the parser but i removed it for this post<<
*/
这里我定义sval是一个字符串:
%union {
int ival;
const char *sval;
no *ast;
}
代币定义
%token <sval> TOKEN_STRING
%token <ival> TOKEN_NUMBER
%token <sval> TOKEN_ID
在这里我看到字符串是 NULL,在这个打印
TOKEN_ID TOKEN_ASSIGN exp {printf("assignemt de id %s para comando\n", ); $$ = createNode("assign", createId(), );}
PS: 我可以得到 "opbin" 的字符串(定义在 %type 部分)
问题已解决,正如 rici 评论的那样,我忘记在字符串和 id 令牌中填充 yylval,只是在 int 令牌上执行此操作,我的错...这是字符串的词法分析器部分的示例:
{string} {printf("Token: %s Type: STRING \n", yytext); yylval.sval = strdup(yytext); return TOKEN_STRING;}
我的问题很简单,但我找不到解决方案。
我正在为 LUA 语言构建一个简单的解析器(没有很多东西,主要是赋值、函数和迭代结构),当我尝试获取标记的字符串值时,它 returns 空。
我可以很好地获取数字的 INT 值。
示例:
输入密码:
a = 1
词汇阶段的输出:
TOKEN_ID TOKEN_ASSIGN TOKEN_NUMBER
当我尝试获取 TOKEN_ID 和 TOKEN_NUMBER 的值时,TOKEN_ID = null,TOKEN_NUMBER = 1
这是所有标记的定义,稍后我会突出显示我的问题的重要部分。
%{
#include <cstdio>
#include <iostream>
#include "ast.h"
#include "potatoCodeGen.h"
using namespace std;
// stuff from flex that bison needs to know about:
extern "C" int yylex();
extern "C" int yyparse();
extern "C" FILE *yyin;
extern int line_num;
no *ast;
void yyerror(const char *s);
%}
%union {
int ival;
const char *sval;
no *ast;
}
//Keywords
%token TOKEN_AND
%token TOKEN_BREAK
%token TOKEN_DO
%token TOKEN_ELSE
%token TOKEN_ELSEIF
%token TOKEN_END
%token TOKEN_FALSE
%token TOKEN_FOR
%token TOKEN_FUNCTION
%token TOKEN_IF
%token TOKEN_IN
%token TOKEN_LOCAL
%token TOKEN_NIL
%token TOKEN_NOT
%token TOKEN_OR
%token TOKEN_REPEAT
%token TOKEN_RETURN
%token TOKEN_THEN
%token TOKEN_TRUE
%token TOKEN_UNTIL
%token TOKEN_WHILE
//Valued Terminals
%token <sval> TOKEN_STRING
%token <ival> TOKEN_NUMBER
%token <sval> TOKEN_ID
//Operator/pontuation Terminals
%token TOKEN_LPAREN
%token TOKEN_RPAREN
%token TOKEN_PLUS
%token TOKEN_MULTIPLY
%token TOKEN_MINUS
%token TOKEN_DIV
%token TOKEN_MOD
%token TOKEN_HAT
%token TOKEN_CROSS
%token TOKEN_EQUAL
%token TOKEN_AEQUAL
%token TOKEN_NEQUAL
%token TOKEN_LEQUAL
%token TOKEN_GEQUAL
%token TOKEN_LESSER
%token TOKEN_GREATER
%token TOKEN_ASSIGN
%token TOKEN_LKEY
%token TOKEN_RKEY
%token TOKEN_LBOX
%token TOKEN_RBOX
%token TOKEN_SEMICOLON
%token TOKEN_TWOPOINTS
%token TOKEN_COLON
%token TOKEN_POINT
%token TOKEN_DOUBLEPOINT
%token TOKEN_ETC
%start Input
%type <ast> bloco
%type <ast> comando
%type <ast> exp
%type <ast> nomedafuncao
%type <ast> corpodafuncao
%type <ast> chamadadefuncao
%type <ast> args
%type <ast> listaexp
%type <ast> listapares
%type <sval> opbin
%%
///*//Debug Area
//prototype: createNode (char *type, no *down, no *next);
Input:
bloco {printf("programa finalizado \n"); ast = ;}
;
bloco:
comando {printf("bloco de um comando encontrado \n"); $$ = createNode("bloco", , NULL);}
| comando bloco {printf("varios comandos encontrados \n"); $$ = createNode("bloco", , ); }
;
//Comandos principais e coisas auxiliares
comando:
TOKEN_ID TOKEN_ASSIGN exp {printf("assignemt de id %s para comando\n", ); $$ = createNode("assign", createId(), );}
/*
*>>Here comes the rest of the grammar and the main of the parser but i removed it for this post<<
*/
这里我定义sval是一个字符串:
%union {
int ival;
const char *sval;
no *ast;
}
代币定义
%token <sval> TOKEN_STRING
%token <ival> TOKEN_NUMBER
%token <sval> TOKEN_ID
在这里我看到字符串是 NULL,在这个打印
TOKEN_ID TOKEN_ASSIGN exp {printf("assignemt de id %s para comando\n", ); $$ = createNode("assign", createId(), );}
PS: 我可以得到 "opbin" 的字符串(定义在 %type 部分)
问题已解决,正如 rici 评论的那样,我忘记在字符串和 id 令牌中填充 yylval,只是在 int 令牌上执行此操作,我的错...这是字符串的词法分析器部分的示例:
{string} {printf("Token: %s Type: STRING \n", yytext); yylval.sval = strdup(yytext); return TOKEN_STRING;}