std::stringstream从字符串中读取int和字符串 我在C++编程,我不知道如何实现以下内容:
我正在将一个文件流复制到内存中(因为我被要求,我更喜欢从流中读取),然后尝试访问它的值以将它们存储到字符串和int变量中 这是为了创建一个解释器。我将尝试解释的代码是(即): 这只是一个简单的示例代码。现在,这些值将首先存储在“映射”结构中,然后在“解释”所有内容时进行访问。 要存储的值包括: int lnum//行号 字符串cmd//命令(打印和转到) string exp//表达式(本例中为A和10,但可以包含(A*b)-c之类的表达式) 下面的代码给出了一个问题,我如何访问这些值并将它们存储在内存中? exp字符串的大小也是可变的(可以只是一个变量或表达式),所以我不知道如何读取它并将其存储在字符串中 代码:std::stringstream从字符串中读取int和字符串 我在C++编程,我不知道如何实现以下内容:,c++,string,stringstream,C++,String,Stringstream,我正在将一个文件流复制到内存中(因为我被要求,我更喜欢从流中读取),然后尝试访问它的值以将它们存储到字符串和int变量中 这是为了创建一个解释器。我将尝试解释的代码是(即): 这只是一个简单的示例代码。现在,这些值将首先存储在“映射”结构中,然后在“解释”所有内容时进行访问。 要存储的值包括: int lnum//行号 字符串cmd//命令(打印和转到) string exp//表达式(本例中为A和10,但可以包含(A*b)-c之类的表达式) 下面的代码给出了一个问题,我如何访问这些值并将它们存
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
#包括“main.hh”
int main()
{
内部长度;
字符*缓冲区;
//获取文件目录
字符串目录;
cout>cmd>>exp;
程序[lnum]=cmd;//在映射中存储值
//从缓冲区释放内存,超出范围
删除[]缓冲区;
返回0;
}
我希望这是清楚的
谢谢你的帮助
瓦莱里奥这可能会有所帮助:
特别是第7.3节
最好不要显式地使用向量来动态分配缓冲区。 这使得内存管理隐式化
// Create buffer and copy stream to it
std::vector<char> buffer(lenght);
p_prog.read (&buffer[0],lenght);
p_prog.close();
//创建缓冲区并将流复制到其中
标准::向量缓冲区(长度);
p_prog.read(和缓冲区[0],长度);
p_prog.close();
就我个人而言,我没有显式地使用close()(除非我想捕获异常)。只要在作用域中打开一个文件,当文件超出作用域时,析构函数就会关闭该文件。如果您已经知道该类型,则可以使用来提取令牌
对于解释器,我强烈建议使用实际的解析器,而不是编写自己的解析器。Boost的库或工作非常好。您可以在解析语法时使用语义操作构建解释器原语,或者只构建AST
另一个选择是Flex&。基本上,这些都是解析预定义语法的工具。你可以建立自己的,但要为挫折做好准备。递归地平衡圆括号或强制执行操作顺序(例如,先除后乘)并非易事
原始C++解析方法如下:
#include <sstream>
#include <string>
// ... //
istringstream iss(buffer);
int a, b;
string c, d;
iss >> a;
iss >> b;
iss >> c;
iss >> d;
#包括
#包括
// ... //
istringstream iss(缓冲区);
INTA,b;
字符串c,d;
iss>>a;
iss>>b;
iss>>c;
iss>>d;
这样做的方法(尤其是您提到的算术表达式部分)是:
- 编写一些代码来确定令牌的结束和开始位置。例如,
或5
将被称为令牌。您可以在文本中扫描这些分隔符,或者使用常用分隔符(如空格)+
- 写出你正在分析的语言的语法。例如,您可以编写:
- (您的需求可能非常简单,可以使用此功能)
- (将语法转换为代码的简单方法)
buffer(lenght])代码>
// Create buffer and copy stream to it
std::vector<char> buffer(lenght);
p_prog.read (&buffer[0],lenght);
p_prog.close();
#include <sstream>
#include <string>
// ... //
istringstream iss(buffer);
int a, b;
string c, d;
iss >> a;
iss >> b;
iss >> c;
iss >> d;
expression -> value
expression -> expression + expression
expression -> expression * expression
expression -> function ( expression )
expression -> ( expression )
+
/ \
5 *
/ \
x 3