c - 在 yacc 和 lex char 数组中制作计算器

标签 c yacc flex-lexer lex

我正在使用 yacc 和 lex,但我遇到了一些问题。

我正在研究计算器。使用我的计算器,您可以执行以下操作:

示例:

user: a = 1+3
user: a
calc: 4

问题是,我只能用一个角色来做到这一点。但我想要最多三个字符。

示例:

user: abc = 1+3
user: abc
calc: 4

我还想添加更多内容。

我的代码也适用于此:

user: abc = 1+3
user: abc
calc: 4
user: ab
calc: 4     /* THIS IS BECAUSE IT SCAN ONLY FIRST CHARACTER */
user: a
calc: 4     /* THIS IS BECAUSE IT SCAN ONLY FIRST CHARACTER */

与我的问题相关的部分代码:

-YACC

%{

int symbolVal(char symbol);
void updateSymbolVal(char symbol, int val);

%}

%union {double num; char id;}
%token <id> identifier
%type <id> assignment

%%

assignment : identifier EQUALS exp { updateSymbolVal($1, $3); }

term   : /*something */
       | identifier { $$ = symbolVal($1); }

%%

/* C CODE */

int symbolVal(char symbol) {
    int bucker = computeSymbolIndex(symbol);
    return symbols[bucket];
}

void updateSymbolVal(char symbol,int val) {
    int bucket = computeSymbolIndex(symbol);
    symbols[bucket] = val;
}

int computeSymbolIndex(char token) {
    int idx = 0;
    idx = token - 'a' + 26;
    return idx;
}

我想说代码是正确的

但我想要所有这些,但最多三个字符。

也许这可以用数组或指针来实现,但我不知道如何实现。

最佳答案

我的猜测是,在 Lex 中您将返回单个字符作为标记。 方法是返回一个代表变量的标记,以及实际名称 yyval。 下面是一些代码片段,说明了要使其工作的代码中的内容 - 尽管在没有看到 lex 文件的情况下我无法为您提供进一步的帮助。

LEX:

[a-zA-Z]+   { yylval.s = new std::string(yytext); return tVARIABLE; }

YACC:

%union {
  str s;    /* symbol name */
}
%token<s> tVARIABLE

...

// on the grammar:
identifier: tVARIABLE { $$ = $1; }

关于c - 在 yacc 和 lex char 数组中制作计算器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27170637/

相关文章:

c - 如何匹配 lex 中的可选标记

c++ - Bison,在 C++ 中与 flex 交互

c - 如何打印匹配的字符串?

c - 该语句的优先级是什么?

c - Apache 模块 : Output Keeps Growing on Each Request

c - 'For' 中的 'If' 使游戏崩溃 - C 语言

compiler-errors - yacc错误没有类型声明,但是我已经在Tiger.grm中声明了这些?

c - 为什么 YACC 不产生 shift-reduce 冲突?

c++ - 采用 OpenCL 的 Intel HD 6000 本地内存带宽

在 CLion 中使用 flex/bison 进行 CMake