C++ 如何在编译器bison/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) ",

我创建了一个小编译器,需要帮助来修复它

我的编译器代码:

t、 l:

我需要升级到(希望可以打印字符串):

在lexer中,我使用:

<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;}