我只是想知道你们中的任何人将如何使用 Flex 和 Bison / Lex 和 Yacc 在 c 中实现多字符变量?如果可以的话,你能提供一个简单的例子吗?
我正在尝试为一种语言编写解释器,但我似乎找不到实现变量的好方法,到目前为止,我尝试过的方法要么失败,要么导致执行任何具有大量变量的程序变得真的所以(我的意思是执行一个只分配 1000 个变量并且什么都不做的程序可能需要几分钟)
谢谢你的时间,弗朗西斯
我只是想知道你们中的任何人将如何使用 Flex 和 Bison / Lex 和 Yacc 在 c 中实现多字符变量?如果可以的话,你能提供一个简单的例子吗?
我正在尝试为一种语言编写解释器,但我似乎找不到实现变量的好方法,到目前为止,我尝试过的方法要么失败,要么导致执行任何具有大量变量的程序变得真的所以(我的意思是执行一个只分配 1000 个变量并且什么都不做的程序可能需要几分钟)
谢谢你的时间,弗朗西斯
在 ADAIC 为 Ada 提供的词法分析器中,使用了以下方法,我发现它对于对多字符文字(例如保留字和变量)进行词法分析非常有用。它(以及相应的 Bison 语法和其他一些东西)可在ADAIC 文档中找到
%%
[a-zA-Z](_?[a-zA-Z0-9])* return(lk_keyword(yytext));
%%
# define NUM_KEYWORDS 69
KEY_TABLE key_tab[NUM_KEYWORDS] =
{
{"ABORT", ABORT},
{"ABS", ABS},
....
....
....
};
lk_keyword(str)
char *str;
{
int min;
int max;
int guess, compare;
min = 0;
max = NUM_KEYWORDS-1;
guess = (min + max) / 2;
to_upper(str);
for (guess=(min+max)/2; min<=max; guess=(min+max)/2) {
if ((compare = strcmp(key_tab[guess].kw, str)) < 0) {
min = guess + 1;
} else if (compare > 0) {
max = guess - 1;
} else {
return key_tab[guess].kwv;
}
}
return identifier;
}