我正在使用 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/