文字列を解析しようとしていますか? 私の推測では、入力ストリームの字句解析 (スキャン) を実行しようとしているのでしょう。
- strtok と文字の先読み/プッシュバックを構築することで、スキャナーを手動でロールすることができます。
- take のような lex や flex を使用して字句スキャナーを構築できます。
- 貧弱なパーサーの一連の正規表現とケースステートメントを使用できます
代数文字列をトークン化したいとします。文法と認識したいトークンを定義する必要があります。BNF (Backus-Naur Formalism) のようなものが必要です。または、「鉄道構文図」を使用することもできます (個人的には BNF を好みますが、鉄道図が好きな人もいます)。
これが始まりです:
expression --> sexpr | nil
parenexpr --> '(' sexpr ')'
sexpr --> parenexpr | addexpr | thing | nil
addexpr --> mulexpr addop mulexpr | mulexpr
mulexpr --> parenexpr
thing --> symbol | integer | real | scientific
integer --> { '+' | '-' }? digit+
real --> { '+' | '-' }? digit+ { . digit+ }?
scientific --> { + | - }? digit+ { . digit+ } e { '+' | '-' }? digit+
addop --> '+' | '-'
mulop --> '/' | '*' | '^' | '%'
relop --> '||' | '&&' | '!'
symbol --> { character | '_' } { character | '_' | digit }*
digit --> [0-9]
character --> [A-Za-z]
//etc
これが意味することは、文法生成記号 (-->) の左側にある各項目は、右側にあるものの 1 つに展開されるということです。この定義は再帰的であることに注意してください。これにより、必要なプログラミングの種類がわかります。とにかく、各トークンをスキャンして識別し、整数、実数、科学、シンボル、addop、mulop、relop、および抽出するその他のトークンを収集する必要があります。途中で、空白 (タブ、スペース、改行) およびその他の未定義の記号を処理する方法を決定する必要があります。