C++ C++;多项式标记器

C++ C++;多项式标记器,c++,polynomials,C++,Polynomials,我目前正在创建一个标记器,它将多项式作为字符串输入,并在多项式中输出一个单项式数组(单个项) 例: 输入:4x^2+3x^-2+2 输出:{“4x^2”、“3x^-2”、“2”} 我不确定该从哪里着手,因为多项式由于例外情况而变得有点棘手。有人能给我提供一些见解吗?这里可能有一些使用正则表达式或模式匹配的快速而肮脏的攻击 然而,实现这种解析的可靠方法是使用我们优秀的高等学府已经(或应该)教授过的标准工具。或者,至少在我的时代是这样。当然,我指的是和 词法分析器(如)以正则表达式的形式获取标记定义

我目前正在创建一个标记器,它将多项式作为字符串输入,并在多项式中输出一个单项式数组(单个项)

例:

输入:
4x^2+3x^-2+2

输出:
{“4x^2”、“3x^-2”、“2”}


我不确定该从哪里着手,因为多项式由于例外情况而变得有点棘手。有人能给我提供一些见解吗?

这里可能有一些使用正则表达式或模式匹配的快速而肮脏的攻击

然而,实现这种解析的可靠方法是使用我们优秀的高等学府已经(或应该)教授过的标准工具。或者,至少在我的时代是这样。当然,我指的是和

词法分析器(如)以正则表达式的形式获取标记定义列表,并生成标记输入流的代码。在这种情况下,我认为以下简单的
flex
规则集应该足以标记多项式:

%{
#include "y.tab.h"
%}

digit         [0-9]
letter        [a-zA-Z]

%%
"+"                  { return PLUS;       }
"-"                  { return MINUS;      }
"*"                  { return TIMES;      }
"/"                  { return SLASH;      }
"^"                  { return EXPONENT;   }
{letter}+ {
                       yylval.id = strdup(yytext);
                       return IDENT;      }
{digit}+             { yylval.num = atoi(yytext);
                       return NUMBER;     }
这将完成从输入字符串中解析出多项式的各个元素的初始任务

词法分析器与
LALR(1)
解析器生成器一起工作,例如,它生成定义要解析的语法的
y.tab.h
文件,以及语法中的元素,例如
加上
减去
和所有其他标记

Bison接受上下文无关语法的规范,并为其生成解析器。语法规范,即使是像这样的简单多项式,也会相当详细,所以这只是多项式语法规范的一个子集:

polynomial: additive_expression;

additive_expression: additive_term
                   | additive_expression plus_or_minus additive_term

plus_or_minus: PLUS | MINUS;

/* additive_term then fleshes out the structure of each polynomial term */
当然,这将通过构建解析树作为规则集一部分的代码片段进行补充


flex
bison
已经存在很长时间了,最初生成的是C代码(因此我的
flex
示例中的C片段);但目前也能够生成C++代码。不用说,如果你不熟悉这些工具,就会有一个陡峭的学习曲线;但是,这是一种经过时间考验的方法,可以为非平凡语法(例如多项式)实现解析器。

难道不能在加号/减号上拆分,然后修剪空白吗?此外,多项式不能有负幂。一旦你允许负幂,它基本上就等同于正则表达式的空间,这是一个不同的(严格来说更大的)空间。我可以,但指数可以是负的,我不知道如何解释。使用正则表达式(regex)。不要使用regex。只需逐个字符扫描,如果字符为正或负,则分割出一个新标记。你应该至少展示一个尝试过的解决方案;我知道现在这个问题不符合你自己合理解决的标准。我目前没有任何代码,只是在纸上写下了我的算法。我对TCKEngIDEN所需要的C++代码并不十分熟悉,所以我只想对任何内置插件有帮助。