我的问题很简单,但我找不到解决方案。
我正在为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; (在%类型部分中定义)
答案 0 :(得分:1)
问题解决了,正如rici评论的那样,我忘了在字符串和id令牌中填充yylval,只在int标记上做,我的坏...这里是字符串的lexer部分的一个例子:< / p>
tuple(x[1:3] for x in C)