Modo analizador (C++)

definición

Dado un idioma, defina una representación de su gramática y defina un intérprete que use esta representación para interpretar oraciones en el idioma.

Escenario de aplicación

  • En el proceso de construcción de software, si el problema en un campo específico es más complicado, estructuras similares aparecerán repetidamente, y si se realiza mediante métodos de programación ordinarios, enfrentará cambios muy frecuentes.
  • En este caso, el problema en un dominio específico se expresa como una oración bajo ciertas reglas gramaticales, y luego se construye un intérprete para explicar dicha oración, a fin de lograr el propósito de resolver el problema.

estructura

inserte la descripción de la imagen aquí

ejemplo de código

//Interpreter.h
/****************************************************/
#ifndef INTERPRETER_H
#define INTERPRETER_H
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <stack>
 
using namespace std;
 
// 抽象表达式类
class Expression 
{
    
    
public:
	// 解释
	virtual int interpret() = 0;
 
};
 
// 数字表达式类
class NumberExpression : public Expression 
{
    
    
public:
	// 构造函数
	NumberExpression(int num) : number(num) {
    
    }
 
	// 解释
	virtual int interpret() {
    
     return number; }
 
private:
	int number;
};
 
// 加法表达式类
class AddExpression : public Expression 
{
    
    
public:
	// 构造函数
	AddExpression(Expression* left, Expression* right) : left(left), right(right) {
    
    }
 
	// 解释
	virtual int interpret() {
    
     return left->interpret() + right->interpret(); }
 
private:
	Expression* left;
	Expression* right;
};
 
// 减法表达式类
class SubExpression : public Expression 
{
    
    
public:
	// 构造函数
	SubExpression(Expression* left, Expression* right) : left(left), right(right) {
    
    }
 
	// 解释
	virtual int interpret() {
    
     return left->interpret() - right->interpret(); }
 
private:
	Expression* left;
	Expression* right;
};
 
// 解释器类
class Interpreter 
{
    
    
public:
	// 构造函数
	Interpreter(string exp) : expression(exp) {
    
    }
 
	// 解释
	int interpret() {
    
    
		stack<Expression*> s;
		// 遍历表达式字符
		for (int i = 0; i < expression.length(); i++) {
    
    
			if (isdigit(expression[i])) {
    
    
				// 识别数字
				int j = i;
				while (j < expression.length() && isdigit(expression[j])) {
    
    
					j++;
				}
				int num = stoi(expression.substr(i, j - i));
				s.push(new NumberExpression(num));
				i = j - 1;
			}
			else if (expression[i] == '+') {
    
    
				// 把左数提取出来
				Expression* left = s.top();
				s.pop();
				// 识别右数
				int j = i + 1;
				while (j < expression.length() && isdigit(expression[j])) {
    
    
					j++;
				}
				Expression* right = new NumberExpression(stoi(expression.substr(i + 1, j - (i + 1))));
				// 左数+右数的表达式放入栈中
				s.push(new AddExpression(left, right));
				i = j - 1;
			}
			else if (expression[i] == '-') {
    
    
				// 把左数提取出来
				Expression* left = s.top();
				s.pop();
				// 识别右数
				int j = i + 1;
				while (j < expression.length() && isdigit(expression[j])) {
    
    
					j++;
				}
				Expression* right = new NumberExpression(stoi(expression.substr(i + 1, j - (i + 1))));
				// 左数-右数的表达式放入栈中
				s.push(new SubExpression(left, right));
				i = j - 1;
			}
		}
		return s.top()->interpret();
	}
 
private:
	string expression;
};


#endif
//test.cpp
/****************************************************/
#include "Interpreter.h"

#include <unordered_map>
int main()
{
    
    
	unordered_map<string, int> variables;
	string input;
	while (getline(cin, input)) {
    
    
		cout << "input:" << input << endl;
		Interpreter interpreter(input);
		variables[input] = interpreter.interpret();
		cout << "result:" << variables[input] << endl;
	}
	return 0;
}

resultado de la operación
inserte la descripción de la imagen aquí

Resumen

  • La aplicación del modo Intérprete es un punto difícil en la aplicación del modo Intérprete. Solo cuando "las reglas comerciales cambian con frecuencia, estructuras similares aparecen repetidamente y son fáciles de abstraer en reglas gramaticales" se puede usar el modo Intérprete.
  • Use el modo Intérprete para representar reglas gramaticales, de modo que las técnicas orientadas a objetos se puedan usar para "extender" fácilmente la gramática.
  • El modo Intérprete es más adecuado para representaciones gramaticales simples, mientras que para representaciones gramaticales complejas, el modo Intérprete generará jerarquías de clases relativamente grandes, y es necesario recurrir a herramientas estándar como los generadores de análisis gramatical.

Supongo que te gusta

Origin blog.csdn.net/weixin_47424753/article/details/132155457
Recomendado
Clasificación