0

Coco/R で dangling-else の問題があります。Coco/R のユーザー マニュアルを理解しようとしてGoogle に問い合わせましたが、自分で問題を解決できません。

問題を次の Coco/R 文法に簡略化しました ( に保存されていますnew4.atg)。

COMPILER Expr 
CHARACTERS

    digit   = '0'..'9'. 
    letter  = 'A'..'Z'.

TOKENS

    number  = digit { digit }.
    name    = letter { digit | letter }.    

PRODUCTIONS

    Expr = Test | Id Test.  
    Test = Test2.   
    Test2=Id | "(" Test ")".        
    Id=IdName|IdNumber.         
    IdName = name.  
    IdNumber = number.      

END Expr.

でコンパイラをビルドしたい場合、次のcoco.bat答えが得られます。

Coco/R (Dec 22, 2014)
checking
new 4.atg(15,1): LL1 warning in Expr: number is start of several alternatives
new 4.atg(15,1): LL1 warning in Expr: name is start of several alternatives
parser + scanner generated
0 errors detected

Googleでの最良の結果では、ステートメントを宣言できることを読みましたIF(isXXXFollowYYY())が、それが最善の解決策であるかどうか、方法はわかりません。(私の例では: Expr = Test | If(isTestFollowID)Id Test. しかし、どこでisTestFollowID宣言されていますか?)

起動時に警告を表示したくありませんcoco.bat

4

1 に答える 1

0

あなたの文法はあいまいです。

からExprIdトークンを確認すると、パーサーは次のいずれかを実行できます。

Expr -> Test -> Test2 -> Id

また

Expr -> Id

LL(1) パーサーは、どのパスを取るべきかを知りません。

当面の問題は、プロダクションIdのリードイン オプション コンポーネントに引き込むことで修正できます。Expr

それ以外の

Expr = Test | Id Test.  

できるよ

Expr = [Id] Test . 

ただし、Test生成は先頭で an にも一致する可能性がIdあるため、文法 LL(1) を作成するには、さらにリファクタリングが必要になるようです。

于 2016-09-12T19:45:40.877 に答える