C++ 如何在编译器bison/lexer中打印字符串?
我创建了一个小编译器,需要帮助来修复它 我的编译器代码: t、 l: 我需要升级到(希望可以打印字符串): 在lexer中,我使用:C++ 如何在编译器bison/lexer中打印字符串?,c++,parsing,compiler-construction,bison,lexer,C++,Parsing,Compiler Construction,Bison,Lexer,我创建了一个小编译器,需要帮助来修复它 我的编译器代码: t、 l: 我需要升级到(希望可以打印字符串): 在lexer中,我使用: <INITIAL>["] { printf("(STRING_OPEN) "); BEGIN(DOUBLE_QUOTES); } <DOUBLE_QUOTES>["] { printf("(STRING_CLOSE) "); BEGIN(INITIAL); printf("(STRING:%S) ",
<INITIAL>["] {
printf("(STRING_OPEN) ");
BEGIN(DOUBLE_QUOTES);
}
<DOUBLE_QUOTES>["] {
printf("(STRING_CLOSE) ");
BEGIN(INITIAL);
printf("(STRING:%S) ",yytext[1]);
}
[“]{
printf(“(字符串打开)”;
开始(双引号);
}
["] {
printf(“(字符串_CLOSE)”);
开始(首字母);
printf(“(字符串:%S)”,yytext[1]);
}
但我不知道如何在解析器中使用它
请帮我完成这个编译器。让我们把它简化为一个可能的操作 我们有以下语法
assignment: '$' identifier '=' exp ';' {updateSymbolVal($2,$4); }
;
exp: number {$$ = createExp($1);}
| string {$$ = createExp($1);}
| exp '+' exp {$$ = addExp($1,$3);}
;
由于表达式可以是许多不同的东西,我们不能只将其保存在整数中,而是需要一个更复杂的结构,如下所示:
enum expType {NUMBER, STRING};
struct Exp{
expType type;
double number;
std::string str;
};
然后我们制作函数来创建表达式:
Exp* createExp(int v){
Exp *e = new Exp();
e->type = NUMBER;
e->number = v;
return e;
}
Exp* createExp(std::string s){
Exp *e = new Exp();
e->type = STRING;
e->str = s;
return e;
}
然后要做所有的计算和作业,你必须检查类型
Exp* addExp(Exp *a, Exp *b){
Exp *c;
if(a->type == NUMBER && b->type == NUMBER){
c->type == NUMBER;
c->number == a->number + b->number;
}
else{
std::cout << "some nice error message\n";
}
return c;
}
当然,如果需要对struct Exp进行更多操作,您也可以制作它的map/vector/array。或者干脆把它交给下一级
多语言支持问题的编辑
正如我在评论中所写,我提到了这个问题。为了满足您的需要,您可以这样做
ASC [a-zA-Z_0-9]
U [\x80-\xbf]
U2 [\xc2-\xdf]
U3 [\xe0-\xef]
U4 [\xf0-\xf4]
UANY {ASC}|{U2}{U}|{U3}{U}{U}|{U4}{U}{U}{U}
UANY+ {yylval.id = yytext[0]; return string;}
我不明白你的问题,你想达成什么?现在看来,您可以只读取单个字符和一个整数。因此,现在所有有效的方法应该是
$c=32
。你想联系什么<代码>$variable=123<代码>$c=“string”?你打算对结果做什么?你可能不会有一个只针对一行的bison解析器,通常你会根据结果构建一个树,但似乎你只有一个整数列表。谢谢你的更新,还有一个问题。您希望最终如何保存结果,以及如何处理这些结果?因为不能同时处理字符串和整数。我试着给你举个例子,看看我在回答中的意思,看看这个问题。他们有一种处理unicode字符串的方法。(请)修复文件并再次发送给我。如果您有进一步的问题,请更新您的问题,像这样其他人也可以从您的问题中获益。我更改问题,请帮助我。
enum expType {NUMBER, STRING};
struct Exp{
expType type;
double number;
std::string str;
};
Exp* createExp(int v){
Exp *e = new Exp();
e->type = NUMBER;
e->number = v;
return e;
}
Exp* createExp(std::string s){
Exp *e = new Exp();
e->type = STRING;
e->str = s;
return e;
}
Exp* addExp(Exp *a, Exp *b){
Exp *c;
if(a->type == NUMBER && b->type == NUMBER){
c->type == NUMBER;
c->number == a->number + b->number;
}
else{
std::cout << "some nice error message\n";
}
return c;
}
void updateSymbolVal(const std::string &identifier, Exp *e){
if(e->type == NUMBER){
myNumbers[identifier] = e->number;
}
if(e->type == STRING){
myStrings[identifier] = e->str;
}
}
ASC [a-zA-Z_0-9]
U [\x80-\xbf]
U2 [\xc2-\xdf]
U3 [\xe0-\xef]
U4 [\xf0-\xf4]
UANY {ASC}|{U2}{U}|{U3}{U}{U}|{U4}{U}{U}{U}
UANY+ {yylval.id = yytext[0]; return string;}