0

Ironyを使用して C99 を解析しようとしていますが、オンラインで文法を見つけました

宣言とステートメントの競合に問題があります。次のルールは、イニシャライザを使用したポインタ宣言の検出に失敗します。

blockItemList.Rule = MakePlusRule(blockItemList, blockItem);
blockItem.Rule = declaration | statement;

失敗している行のタイプは次のとおりです。

MyType *x = foo();

ステートメントのルール (どちらも識別子で始まる可能性があります) から、labeledStatement と expressionStatement を削除すると、このタイプの宣言が正しく認識されます。

ステートメントを試す前に、Irony に宣言ルールを使い果たすように強制する最良の方法は何ですか? または、Irony が解析するときに文法に追加して、MyType を識別子ではなく端末として登録できるようにすることはできますか?

4

1 に答える 1

1

関数呼び出しと識別子で同様の問題が発生したことを覚えています。特に間違ったことをしたとは思わないでください。それは単に文法が機能する方法です。Irony 用に「微調整」する必要があります。私が知る限り、Irony は LALR(1) パーサーです。たとえば、意思決定を行う際に 1 つのシンボルだけを調べます。これは、与えられた文法を定義するだけでなく、より多くの作業を行う必要があることを意味する場合があります。

文法に矛盾がある場合があり、文法の「精度」を下げることで修正しました。実際の精度は、後で AST ノードを介して復元されました。

追伸、次のこともできます。

Irony GrammarExplorer を使用して、文法にどのような矛盾があるかを確認してください。PreferSHiftHere() または ReduceHere() を使用して競合を修正できる場合があります

そして、私が読むのが面白いと思ういくつかのリンク:

http://irony.codeplex.com/discussions/400830

http://irony.codeplex.com/discussions/80134

https://irony.codeplex.com/discussions/551074

コンテキストフリーの文法を理解するだけでは十分ではありません。LR、LALR(1)、LL などの構文解析メソッドについて熟知している必要があります。皮肉なのは LALR(1) ですが、Antlr は LL です。文法規則は、特定のメソッドに合わせて微調整する必要があります。皮肉なことに「間違った」ことを「主張している」とは、それが報告するあいまいさ (競合!) から生じる 2 つの同等に可能な選択肢のうちの 1 つを採用したことを意味します。したがって、競合を修正する前に、smth を解析しようとしても意味がありません。これを行うには - LALR 文法の詳細をお読みください。

于 2014-08-23T14:22:45.460 に答える