1. paizaラーニングトップ
  2. レベルアップ問題集
  3. 構文解析メニュー(言語選択)
  4. 問題一覧 Go編
  5. ()付きで冪乗を含む四則演算と剰余算(字句解析#6) Go編

構文解析メニューのサムネイル
()付きで冪乗を含む四則演算と剰余算(字句解析#6) Go編(paizaランク C 相当)

問題にチャレンジして、ユーザー同士で解答を教え合ったり、コードを公開してみよう!

問題

下記の問題をプログラミングしてみよう!

()付きで冪乗を含む四則演算と剰余算で構成される中置記法の数式 S が文字列で与えられます。S を演算子と値に分けて出力してください。


なお、式には以下の制約が設けられています。


ある整数 a, b について

・ a / b の計算結果は小数点以下切り捨て

・ a / b において a > 0、b ≧ 0

・ a % b において a > 0、b ≧ 0


数式は以下のEBNFに従って記述されます。



EBNF


<expr>   ::= <term> ( ('+'|'-') <term> )*
<term> ::= <power> ( ('*'|'/'|'%') <power> )*
<power> ::= <factor> ( '^' <factor> )*
<factor> ::= <number> | ( '(' <expr> ')' )*
<number> ::= [0-9]+


※ただし、 0 を除いて整数の先頭に 0 がある数字はないものとします。


例)000、001、023






EBNFについて


EBNFとはBNFと正規表現の組み合わせによって記述される文法で、言語の構文を定義するために用いられます。



BNFの記法について


EBNFは非終端記号と終端記号を用いた生成規則によって記述されます。



・ 非終端記号とは

角括弧で囲まれた記号で表されたもので、ある規則で定義されるシンボルとなります。


・ 終端記号とは

実際に使用される数字、文字、文字列です。

BNFの場合は引用符 ("") によって囲まれます。


記述例は以下の通りです。



<paiza> ::= <string>; 
<string> ::= <char> | <string> <char>;
<char> ::= "p" | "a" | "i" | "z";


左辺のシンボルは右辺によって定義されます。






正規表現について


正規表現は文字列の集合(パターン)を表す汎用的な記法です。メタ文字が定義され、その組み合わせによって文字列の部分的なマッチングを検索することができます。



メタ文字の例


・ '*'

直前の文字が 0 回以上繰り返される文字列にマッチ


・ '+'

直前の文字が 1 回以上繰り返される文字列にマッチ


・ '|'

前後の文字列の論理和を取る文字列にマッチ


・ '( )'

'('と')'の中の文字列をグループとして扱う


・ '[ ]'

'['と']'の中の文字列のいずれかにマッチ



今回の場合、式 <expr> は 1 つの <term> と 0 個以上の ( ('+'|'-') <term> ) の組み合わせで構成されており、<term> は 1 つの <power> と 0 個以上の ( ('*'|'/'|'%') <power> ) の組み合わせで構成されており、<power> は 1 つの <factor> と 0 個以上の ( '^' <factor> ) の組み合わせで構成されており、<factor> は 1 つの <number> と 0 個以上の ( '(' <expr> ')' ) の組み合わせで構成されていることを表しています。


また、<number> は 0 から 9 のいずれかの文字が 1 つ以上連続で繋がったものです。






中置記法について


中置記法は、演算子を操作対象の間に記述する方法です。


例1)1+2は 1 に 2 を足すことを意味します。


例2)123*456-789は 123 に 456 を掛けた結果から 789 を引くことを意味します。

入力される値

・ 数式 S が 1 行で与えられます。


S


入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。 標準入力からの値取得方法はこちらをご確認ください
期待する出力

整数と演算子の総数を n とします。合計で n+1 行の出力をしてください。

1 行目には式に含まれる整数と演算子の総数を出力してください。

2 行目以降の n 行には、1 行ごとに数式に含まれる整数または演算子およびそのタイプを中置記法の順に空白区切りで出力してください。

また、末尾に改行を入れ、余計な文字、空行を含んではいけません。



入力例
5*(4-2)^3%3


出力例
11
5 number
* operator
( parentheses
4 number
- operator
2 number
) parentheses
^ operator
3 number
% operator
3 number

条件

すべてのテストケースにおいて、数式は以下の条件をみたします。

・ S に含まれるものは整数と演算子と()のみ

・ S は式として正しいことが保証されている

・ 演算子の種類は '+', '-', '*', '/', '%', '^' の 6 種類のみ

・ 1 ≦ |S| ≦ 105(|S| は S の文字数)

・ 0 ≦ 式に含まれる整数 < 106

・ 式の値は常に10-9 < 式の値 < 109 の範囲を超えない

入力例1

5*(4-2)^3%3

出力例1

11
5 number
* operator
( parentheses
4 number
- operator
2 number
) parentheses
^ operator
3 number
% operator
3 number

問題一覧へ戻る

ページの先頭へ戻る