11

コンパイラの本を読んでいるのですが、「S 属性の文法は L 属性の文法でもある」と書かれていて、ちょっと混乱しています。理解できませんでした。誰かがそれを明確にすることができますか (例は素晴らしいはずです)。ありがとう。

4

2 に答える 2

14

L属性文法

L 属性文法は、特殊なタイプの属性文法です。これにより、属性を抽象構文ツリーの左から右への 1 回のトラバーサルで評価できます。その結果、L 属性文法の属性評価は、トップダウン構文解析に便利に組み込むことができます。多くのプログラミング言語は L 属性です。特殊なタイプのコンパイラであるナロー コンパイラは、何らかの形式の L 属性文法に基づいています。これらは S 属性の文法に匹敵します。コード合成に使用されます。

S属性文法

S-Attributed Grammars は、継承された属性を持たないことを特徴とする属性文法のクラスです。構文解析プロセスの意味解析中に抽象構文ツリーの親ノードから子ノードに渡されなければならない継承された属性は、ボトムアップ構文解析では問題になります。ツリーは、すべての子の作成後に作成されます。S 属性文法の属性評価は、トップダウン構文解析とボトムアップ構文解析の両方に便利に組み込むことができます。yacc は、S 属性のアプローチに基づいています。

S 属性の文法は、L 属性の文法でもあります。

L 属性文法では、属性評価は左から右へのトラバーサルで実行できます。S 属性の文法では属性は継承されないため、それを実行することを妨げるものではありません。そのため、S 属性の文法は L 文法の特性に準拠していると言えます。

于 2010-03-16T22:23:04.867 に答える
3

単純 S 属性文法は、厳密に合成型の文法手段を持つ文法であり、構文木全体で値属性のみを持ちます。

ここで、L属性の文法は、常に左から右への継承の転送を持つルールのようないくつかのルールを持つ、合成された文法と継承された文法の両方を持つことができます。私はそれがあなたを助けると思います。

于 2016-04-09T22:18:01.993 に答える