[英]C++ Polynomial Tokenizer
我目前正在創建一個標記化器,它將多項式作為一個字符串,並在多項式中輸出一個單項式(單個項)數組。
例如:
輸入: 4x^2+3x^-2+2
輸出: { "4x^2", "3x^-2", "2" }
由於多項式由於異常而變得更加棘手,因此我不確定從何處開始。 任何人都可以提供任何見解嗎?
這里可能會使用正則表達式或模式匹配來完成一些快速而骯臟的黑客攻擊。
然而,實現這種解析的有效方法是使用我們優秀的高等教育機構已經(或應該已經)教過的標准工具。 或者,至少他們在我的時間。 當然,我指的是詞法分析器和LALR(1)解析器生成器 。
詞法分析器(如flex )以正則表達式的形式獲取令牌定義列表,並生成用於標記輸入流的代碼。 在這種情況下,我認為以下簡單的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)
解析器生成器一起工作,例如bison ,它生成定義要解析的語法的y.tab.h
文件,以及語法中的元素,如PLUS
, MINUS
和所有其他令牌。
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 ++代碼。 不言而喻,如果您不熟悉這些工具,將會有一個陡峭的學習曲線; 但這是為非平凡語法實現解析器的經過時間考驗的方法,例如多項式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.