0

次のような新しい言語を解析したいとしましょう。

main.mylang

import "tags.mylang"
cat dog bacon

tags.mylangそして、次のような別のファイルがあります。

cat "meow"
dog "woof"
bacon "sizzle"

実行main.mylangすると出力されます

meow woof sizzle

私が抱えている問題は、mylang開発者が実装したように、「猫」、「犬」、および「ベーコン」が別のファイルで定義されていることです。つまり、事前に文法の一部にすることはできません。

解析中にこれらのタグを文法に動的に追加することは可能ですか? \w+認識されないタグでエラーが発生するようにするため、ワイルドカードなどを追加したくありません。

編集:jisonに基づいた を使用してこれを書いていbisonます。

4

2 に答える 2

2

パターンが何であれ、タグはすべて変数のパターンと一致すると仮定します。(\a\w*、多分)。キーがタグである辞書を定義します。値は、タグに関連付けたいものであれば何でもかまいません。私が理解しているように、この辞書をオブジェクト内に配置することで、パーサーとレクサーの両方でこの辞書を使用できるようにすることができますparser.yy

変数のレクサールールは次のようになります(私はjisonについてあまり知らないので、これはbison + flexに基づいています):

{variable}    if (yytext in yy.tags) { return TAG; } else { return VARIABLE; }

タグごとに異なるトークンタイプが必要な場合(おそらく、タグが文法概念のエイリアスであるなどの理由で)、トークンディクショナリにトークンタイプを格納して、レクサーから返すことができます。

タグ定義ファイルの文法では、キーと適切な値をに追加するだけでタグ定義を追加できますyy.tags

于 2013-03-13T15:54:23.503 に答える
1

\w+提案したワイルドカードの一致を使用して、パーサーのセマンティックロジックが認識されない/未定義のタグを検出したときにYYERRORマクロを使用して独自の構文エラーを発生させることができます。

于 2013-03-12T14:32:54.807 に答える