1

バックグラウンド:

私はソフトウェアセマンティクスのクラスを取っています.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 ループの本体は複合ステートメントで構成されていますが、これは私が望んでいたものではありません。この効果を得るには、優先ルールをどのように設定すればよいですか?

4

2 に答える 2

0

私は自分の課題を誤解していたようです。私が説明した優先順位の規則は私のコースブックに提示されているものですが、私の主な関心事は先生から与えられたパーサーとの互換性であるため、上記のコードで試してみたところ、代入も本文に解析されます.

私が書きたかったプログラムは、「単に」次のようになっている必要があります。

(while true do skip) ; x := y

でもねえ、少なくともそれは互換性があります!

于 2013-04-28T13:25:10.440 に答える