2

私が作成しているいくつかのコンパイラの文法を実行する必要があります: 二項演算子&&||単項演算子#*、次のような方法で:

I) II||よりも優先されるもの: a && b && c は ((a&&b)&&c)を左に結合します。 III)右に結合します IV) 単項演算子は同等の優先順位を持ち、2 項演算子よりも多くなります。&&
&&
||

私は次のようなことを考えていました:

E -> E || T | E && T | T
T -> T # F | T * F
F -> (E) | Numbers
Numbers -> 0 | 1 | 2 | 3 | ... | 9

それは間違っているでしょうか?何か案は ?

4

1 に答える 1

2

このような単純な式の場合は、常に優先順位の低いものから開始できます。

したがって、一連の&&ed 式が必要になります。それぞれの||式は、同じように先行する単項演算子の ed 式です。

それを書き留める前に、次の 2 つのルールを確認してください。

E -> E + T

E -> T + E

最初の規則は+左結合を作成し、2 番目の規則は右結合を作成します (考えてみてください)。したがって、&&左結合と||右結合にする必要があります。

E -> E '&&' T | T         # left associative &&
T -> F '||' T | F         # right associative ||

単項演算子のルールはかなり簡単です。

F -> '#' F | '*' F | N    # apply unary operators without precedence from right to left

最後に、最も先行するのは括弧です。これは、壊れないトークンを持っているかのようです。ただし、括弧内には任意の式を含めることができます。

N -> '(' E ')' | number

number自体は、次のような正規表現で表現できます。'[1-9][0-9]*'

于 2012-09-04T13:53:06.110 に答える