Bison Parser:令牌字符串值返回NULL

时间:2015-08-18 22:08:23

标签: string parsing lua bison

我的问题很简单,但我找不到解决方案。

我正在为LUA语言构建一个简单的解析器(没有很多东西,主要是赋值,函数和迭代结构),当我尝试获取令牌的字符串值时,它返回null。

我可以获得数字的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 = $1;}
    ;

bloco:
    comando {printf("bloco de um comando encontrado \n"); $$ = createNode("bloco", $1, NULL);} 
    | comando bloco {printf("varios comandos encontrados \n"); $$ = createNode("bloco", $1, $2); } 
    ;

//Comandos principais e coisas auxiliares
comando:
    TOKEN_ID TOKEN_ASSIGN exp {printf("assignemt de id %s para comando\n", $1); $$ = createNode("assign", createId($1), $3);}

/*
*>>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",     $1); $$ = createNode("assign", createId($1), $3);}

PS:我可以得到&#34; opbin&#34; (在%类型部分中定义)

1 个答案:

答案 0 :(得分:1)

问题解决了,正如rici评论的那样,我忘了在字符串和id令牌中填充yylval,只在int标记上做,我的坏...这里是字符串的lexer部分的一个例子:< / p>

tuple(x[1:3] for x in C)