Happy (Haskell Tool) でパーサーを実行しようとしていますが、「未使用の罫線: 11 および未使用の端末: 10」というエラー メッセージが表示され、これが何を意味するのかわかりません。一方、ルールのステートメントでの $i パラメータの使用については本当によくわかりません。私のエラーはそれが原因だと思います。誰かが私を助けることができれば...
3 に答える
これらのメッセージが表示されてもエラーではありません。開始記号から到達できないため、文法の一部が使用されていないことを意味します。Happy があなたの文法をどのように理解するかについての詳細を確認するには、--info
フラグを Happyに使用します。
happy --info MyParser.y
MyParser.info
通常の に加えてファイルを生成しますMyParser.hs
。
未使用のルールと終端は、私の記憶が正しければ、最上位の解析ステートメントから到達する方法がない文法の一部です。$$ パラメータの使用方法については、ハッピー ユーザー ガイドをお読みください。
$$ 記号は、このトークンの値を表すプレースホルダーです。通常、トークンの値はトークン自体ですが、$$ 記号を使用することで、トークン オブジェクトの一部のコンポーネントを値として指定できます。
未使用のルールと端末は、解析中に到達できないルールを記述したことを意味します(「trueの場合、1 else 2」のように、2ブランチに到達することはありません)。詳細については、-infoの出力を確認してください。
$$の場合、これはデータエクストラクタです。次のタイプのトークンを生成するレクサーがあるとします。
data TokenType = INT | SYM
data TokenLex = L TokenType String
ここで、TokenTypeは、有用なデータとキーワードを区別するためのものです。
パーサーのアクションでは、$$を使用して文字列部分を抽出できます
%token INTEGER {L INT $$ }
%token OTHER {L _ $$}
foo : INTEGER bar INTEGER { read $1 + read $3 }
| ...
このルールでは、$1は「最初のINTEGERのコンテンツを教えてください」を意味し、$3は「2番目のINTEGERのコンテンツを教えてください」を意味します。$ 2は、「バーの内容を教えてください(これは別の複雑なルールかもしれません)」を意味します。
$$のおかげで、$1と$3はgeniuneHaskell Stringです。これは、「INTEGERのコンテンツはTokenLexの「String」部分であり、Token全体ではない」とHappyに伝えたためです。