compiler-construction 相关问题

标记编译器构造应该应用于有关编译器编程的问题或有关编译器详细内部工作的问题。请勿使用*使用*特定编译器或编译错误的问题。

我正在为 c/c++ 设置 vs 代码设置,这是在应用包更改时出现的

[这来自 mingw 安装管理器] 这是安装管理器的正常界面 (https://i.stack.imgur.com/0LBgd.png) 在

回答 0 投票 0

是否可以将 .NET IL 代码编译为机器代码?

我想在没有 .NET 框架的情况下分发我的 .NET 程序。是否可以将 .NET 程序编译为机器码?

回答 13 投票 0

生成 while 的 llvm ir 时出现分段错误

我想在我的玩具 C 编译器中支持编译。 我的想法是: 在支持 while 之前支持 do-while。然后使用 do-while AST 构造一个 while AST。所以我可以简化代码生成函数...

回答 0 投票 0

我正在尝试访问一个旧的手机游戏,但服务器已关闭

我想对这款名为“Animal Voyage”的游戏进行逆向工程,互联网上有很多 apk,但有一个问题,游戏的服务器已关闭,我...

回答 0 投票 0

如何让C语言上下文无关?

我知道C不是上下文无关语言,一个著名的例子是: 诠释富; 类型定义 int foo; 富x; 在这种情况下,词法分析器不知道第 3 行中的 foo 是标识符还是 typedef ....

回答 3 投票 0

'int'之前的预期不合格ID

我在任何声明中都遇到了这个错误,比如 $$ = 新向量 例如: parser.y:109:29: 错误:'int' 之前应有不合格的 id 109 | stmts : stmt TSEMIC {$$ = 新向量 我在任何声明中都遇到了这个错误 $$ = new vector<int> 如: parser.y:109:29: error: expected unqualified-id before ‘int’ 109 | stmts : stmt TSEMIC {$$ = new vector<int>; *$$ = $1;} | ^~~ parser.y:109:29: error: expected ‘)’ before ‘int’ 109 | stmts : stmt TSEMIC {$$ = new vector<int>; *$$ = $1;} | ~ ^~~ | ) parser.y:109:61: error: expected unqualified-id before ‘int’ 109 | stmts : stmt TSEMIC {$$ = new vector<int>; *$$ = $1;} | ^ parser.y:109:61: error: expected ‘)’ before ‘int’ 109 | stmts : stmt TSEMIC {$$ = new vector<int>; *$$ = $1;} | 编译后找不到原因,这里是 .y 文件,只有语法部分会产生错误。 %define parse.error verbose %{ #include <stdio.h> #include <iostream> #include <vector> #include <string> using namespace std; extern int yylex(); extern int yylineno; extern char *yytext; extern int yyerrornum; void yyerror (const char *msg) { cout << "line " << yylineno <<": " << msg << " at token " << yytext << endl ; yyerrornum++; } #include "Codigo.hpp" #include "Exp.hpp" expresionstruct makecomparison(std::string &s1, std::string &s2, std::string &s3) ; expresionstruct makearithmetic(std::string &s1, std::string &s2, std::string &s3) ; // Añado la declaración de la función unir. Si la hacéis diferente, debéis cambiar esta declaración. vector<int> unir(vector<int> lis1, vector<int> lis2); Codigo codigo; %} /* qué atributos tienen los símbolos */ %union { string *str ; vector<string> *list ; expresionstruct *expr ; int number ; vector<int> *numlist; } /* declaración de tokens. Esto debe coincidir con tokens.l */ %token <str> TIDENTIFIER TINTEGER TDOUBLE %token <str> TCEQ TCNE TCLT TCLE TCGT TCGE TEQUAL %token <str> TLPAREN TRPAREN TLBRACE TRBRACE TCOMMA TDOT %token <str> TPLUS TMINUS TMUL TDIV %token <str> TCOLON TSEMIC TASSIG %token <str> RPROGRAM RIS RBEGIN RENDPROGRAM RVAR RINTEGER RFLOAT RENDPROCEDURE RPROCEDURE RIN ROUT RIF RTHEN RELSE RENDIF RGET RPUT_LINE RDO RWHILE RENDWHILE REXIT /* declaración de símbolos no terminales con atributos */ %type <str> ident %type <str> numeric %type <expr> expr %type <number> M %type <numlist> N %type <int> stmt %type <int> stmts //Falta declarar stmt stmts %left TASSIG %left TCEQ TCNE TCLT TCLE TCGT TCGE TEQUAL %left TPLUS TMINUS %left TMUL TDIV %start program %% program : RPROGRAM { codigo.anadirInstruccion("prog" ) ;} ident RIS decls RBEGIN stmts RENDPROGRAM TSEMIC { codigo.anadirInstruccion("halt"); codigo.escribir() ; } ; decls : RVAR list TCOLON type TSEMIC decls |%empty ; type : RFLOAT | RINTEGER ; list : ident | list TCOMMA ident ; stmts : stmt TSEMIC {$$ = new vector<int>; *$$ = $1;} | stmts stmt TSEMIC {$$ = new vector<int>; *$$ = unir($1,$2);} ; vector<int> unir(vector<int> lis1, vector<int> lis2){ vector<int> res; res = lis1; res.insert(res.end(), lis2.begin(), lis2.end()); return res; } 这是 .cpp 部分: #include "Codigo.hpp" using namespace std; /****************/ /* Constructora */ /****************/ Codigo::Codigo() { siguienteId = 1; } /***********/ /* nuevoId */ /***********/ string Codigo::nuevoId() { string nId("__t"); nId += to_string(siguienteId++); return nId; } /*********************/ /* anadirInstruccion */ /*********************/ void Codigo::anadirInstruccion(const string &instruccion) { string cadena; cadena = to_string(obtenRef()) + ": " + instruccion; instrucciones.push_back(cadena); } /***********************/ /* anadirDeclaraciones */ /***********************/ void Codigo::anadirDeclaraciones(const vector<string> &idNombres, const string &tipoNombre) { vector<string>::const_iterator iter; for (iter=idNombres.begin(); iter!=idNombres.end(); iter++) { anadirInstruccion(tipoNombre + " " + *iter ); } } /*********************/ /* anadirParametros */ /*********************/ void Codigo::anadirParametros(const vector<string> &idNombres, const string &tipoNombre) { vector<string>::const_iterator iter; for (iter=idNombres.begin(); iter!=idNombres.end(); iter++) { anadirInstruccion("param_" + tipoNombre + " " + *iter ); } } /**************************/ /* completarInstrucciones */ /**************************/ void Codigo::completarInstrucciones(vector<int> &numInstrucciones, const int valor) { string referencia = " " + to_string(valor) ; vector<int>::iterator iter; for (iter = numInstrucciones.begin(); iter != numInstrucciones.end(); iter++) { instrucciones[*iter-1].append(referencia); } } /************/ /* escribir */ /************/ void Codigo::escribir() const { vector<string>::const_iterator iter; for (iter = instrucciones.begin(); iter != instrucciones.end(); iter++) { cout << *iter << " ;" << endl; } } /************/ /* obtenRef */ /************/ int Codigo::obtenRef() const { return instrucciones.size() + 1; } 还有.hpp #ifndef CODIGO_HPP_ #define CODIGO_HPP_ #include <iostream> #include <sstream> #include <fstream> #include <set> #include <vector> /* Estructura de datos para el código generado. El código, en vez de escribirlo directamente, * se guarda en esta estructura y, al final, se escribirán en un fichero. */ class Codigo { private: /**************************/ /* REPRESENTACION INTERNA */ /**************************/ /* Instrucciones que forman el código. */ std::vector<std::string> instrucciones; /* Clave para generar identificaciones nuevos. Cada vez que se crea un idse incrementa. */ int siguienteId; public: /************************************/ /* METODOS PARA GESTIONAR EL CODIGO */ /************************************/ /* Constructora */ Codigo(); /* Crea un nuevo identificador del tipo "__t1, __t2, ...", siempre diferente. */ std::string nuevoId() ; /* Añade una nueva instrucción a la estructura. */ void anadirInstruccion(const std::string &instruccion); /* Dada una lista de variables y su tipo, crea y añade las instrucciones de declaración */ void anadirDeclaraciones(const std::vector<std::string> &idNombres, const std::string &tipoNombre); /* Dada una lista de parámetros y su tipo, crea y añade las instrucciones de declaración */ void anadirParametros(const std::vector<std::string> &idNombres, const std::string &tipoNombre) ; /* Añade a las instrucciones que se especifican la referencia que les falta. * Por ejemplo: "goto" => "goto 20;" */ void completarInstrucciones(std::vector<int> &numInstrucciones, const int valor); /* Escribe las instrucciones acumuladas en la estructura en el fichero de salida. */ void escribir() const; /* Devuelve el número de la siguiente instrucción. */ int obtenRef() const; }; #endif /* CODIGO_HPP_ */ 所有定义都在这段代码中,令牌、函数定义在其他档案中,在那里找不到任何问题,我猜是一些错误的声明,但这是我第一次在使用相同的声明编译代码后得到这个错误没有出现这个错误。 因为我是新用户,我不能写评论。 但是,最后一个语法规则和附加代码之间缺少%% 应该是这样的: stmts : stmt TSEMIC {$$ = new vector<int>; *$$ = $1;} | stmts stmt TSEMIC {$$ = new vector<int>; *$$ = unir($1,$2);} ; %% vector<int> unir(vector<int> lis1, vector<int> lis2){ vector<int> res; res = lis1; res.insert(res.end(), lis2.begin(), lis2.end()); return res; }

回答 1 投票 0

在C++中,右值可以用作赋值运算符的左手操作数吗?

结构测试{ 测试(int x):值(x){} 测试&运算符=(常量测试&那){ 价值=那个。价值; // #1 返回*这个; } 整数值{0}; }; 内部主要(){ 测试(1 ...

回答 0 投票 0

了解编译器优化对现代 C++ 中性能和代码大小的影响

我正在尝试更深入地了解各种编译器优化对现代 C++ 应用程序的性能和代码大小的影响。我正在使用 C++17 项目作为我的测试...

回答 0 投票 0

创建我自己的编程语言{重复} [关闭]

我知道 C++,我非常擅长 JAVA,擅长 css html,并且我还可以使用 Javascript。所以我在想JAVA是怎么产生的。我在谷歌上搜索但没有得到有效的答案。我的意思是怎么可能

回答 0 投票 0

如何在 JTextArea 上写下所有单词,即使每一行有多个单词?

我正在做一个词法分析器,我似乎找不到通过 JTextArea 并取出上面写的所有单词的方法,所以我可以将它们与正则表达式进行比较并继续......

回答 1 投票 0

LLVM |如何实现逻辑非运算的IR代码生成

假设我有这样一个函数: // 全局变量 llvm::LLVMContext* 上下文; llvm::模块*模块; llvm::IRBuilder<>* 构建器; 值* logical_not_codegen(值*操作数){ 返回

回答 1 投票 0

如何计算以下几组布尔表达式

语法如下: bexpr -> bexpr 或 bterm |术语 bterm -> bterm 和 bfactor |因子 bfactor -> 不是 bfactor | (bexpr) |真 |错误的 我已经删除了左递归...

回答 0 投票 0

std::any 使用 antlr4 c++ 访问者构造 AST 的继承问题

我正在尝试使用生成的 BaseVisitor 类的继承实例从我用于简单编译器的语法的解析树构造 AST。 考虑我的语法的一个子集......

回答 1 投票 0

龙书习题——我的翻译方案对吗?

我开始做龙书第二版的练习2.4.5,在网上找到了一些答案,但对我来说似乎是错误的 首先这是练习: 构建语法制导翻译

回答 0 投票 0

编译器构造函数中IRS的解释

有两类 IR(线性的和基于图形的)。简要说明 必要时举例说明每种方法的区别、优点和局限性。

回答 0 投票 0

试图解决 Mini-C 文法的悬挂问题

我有这个语法: 翻译单位 ::= 外部声明 |翻译单元外部声明 外部声明 ::= 函数定义 |宣言 函数定义...

回答 1 投票 0

如何理解 java antlr4 词法分析器文件中的 CHAR_LITERAL 规则

java antlr4 词法分析器文件 CHAR_LITERAL: '\'' (~['\ ] | EscapeSequence) '\''; 片段转义序列 : '\' 'u005c'? [btnfr"'\] | '\''u005c'? ([0-3]?[0-7])? [0-7] | '\...

回答 0 投票 0

如何了解 C++ 编译器 [关闭]

在过去的几个月里,我对 C++ 编译器很感兴趣。他们基本上是如何在内部工作的。 我看到有很多编译理论相关的书,但我似乎找不到一本...

回答 0 投票 0

ANTLR4 中的输入不匹配

我是 ANTLR 的新手。我没有发现我的语法有任何问题,但是当我运行解析树时,ANTLR 给我不匹配的输入消息。谁能帮我解释为什么我会这样? 这是我的词法分析器 词法分析器

回答 2 投票 0

如何删除左递归和右递归都存在的文法中的左递归?

语法如下: E->a E->E+E E->S,E E->(E) S-> bS' S'->;bS' S'-> 我不知道如何删除左递归,因为 E 包含终端和非终端。还有...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.