バックグラウンド:
私はソフトウェアセマンティクスのクラスを取っています.while と呼ばれるおもちゃの言語用の小さなコンパイラとランタイムを作成することになっています. Java のコード スケルトンが与えられましたが、好きな言語を使用することが許可されています。私はこれを文法のリハーサルの機会と考え、代わりに C++ でラボを行うのはクールだと考えました。
現在、ステートメントの優先順位ルールを設定する際に問題が発生しています。これが現在の私のBNFC文法ファイルです。
SSkip. Stmt ::= "skip";
SAss. Stmt ::= VarName ":=" AExp;
SIf. Stmt1 ::= "if" BExp "then" Stmt "else" Stmt;
SWhile. Stmt1 ::= "while" BExp "do" Stmt;
SComp. Stmt ::= Stmt ";" Stmt;
coercions Stmt 1;
token VarName (letter (letter | digit) *);
EAdd. AExp ::= AExp "+" AExp1;
ESub. AExp ::= AExp "-" AExp1;
EMul. AExp1 ::= AExp1 "*" AExp2;
EDiv. AExp1 ::= AExp1 "/" AExp2;
EInt. AExp2 ::= Integer;
EVar. AExp2 ::= VarName;
coercions AExp 2;
BTrue. BExp1 ::= "true";
BFalse. BExp1 ::= "false";
BNeg. BExp ::= "not" BExp;
BConj. BExp ::= BExp "and" BExp;
BLeq. BExp ::= AExp "<=" AExp;
coercions BExp 1;
私が欲しいのは入力です
while true do skip; x:=y
私の複合ルールに従って次のようなものに解析されます
(SComp [SWhile [BTrue] [SSkip]] [(SAss "x" [EVar "y"])])
つまり、割り当てをループ本体の一部にしないでください。しかし、私が得るのは
(SWhile [BTrue] [(SComp SSkip (SAss "x" [(EVar "y")]))])
ご覧のとおり、while ループの本体は複合ステートメントで構成されていますが、これは私が望んでいたものではありません。この効果を得るには、優先ルールをどのように設定すればよいですか?