0

Happy の公式サイトで提供されている happy パーサーにこの文法セクションがありますが、括弧内のルールの意味についてより深い説明が必要です。これがトークンの定義です

%token 
      let             { TokenLet }
      in              { TokenIn }
      int             { TokenInt $$ }
      var             { TokenVar $$ }
      '='             { TokenEq }
      '+'             { TokenPlus }
      '-'             { TokenMinus }
      '*'             { TokenTimes }
      '/'             { TokenDiv }
      '('             { TokenOB }
      ')'             { TokenCB }

そしてここに文法セクションがあります

Exp   : let var '=' Exp in Exp  { Let $2 $4 $6 }
          | Exp1                    { Exp1 $1 }

Exp1  : Exp1 '+' Term           { Plus $1 $3 }
      | Exp1 '-' Term           { Minus $1 $3 }
      | Term                    { Term $1 }

Term  : Term '*' Factor         { Times $1 $3 }
      | Term '/' Factor         { Div $1 $3 }
      | Factor                  { Factor $1 }

Factor            
      : int                     { Int $1 }
      | var                     { Var $1 }
      | '(' Exp ')'             { Brack $2 }

私が理解しているのは、ファイルの下で定義されているレクサーは、定義されたタイプのトークンのみを生成し、文法を使用して解析ツリーを構築する必要があるということです。しかし、「{Let $2 $4 $6}」とは正確にはどういう意味ですか? $2 が 2 番目のルール引数などを指していることは知っていますが、誰かがルールの「人間が読めるバージョン」をくれれば、私は本当に幸せです。私がはっきりしていることを願っています。

前もって感謝します。

4

2 に答える 2

1

この行は、プロダクションを作成 (解析) するための 1 つのルールですExp

Exp   : let var '=' Exp in Exp  { Let $2 $4 $6 }

これは次の規則に対応します。

if you see "let"        ($1)
followed by a variable name  ($2)
followed by "="         ($3)
followed by an Exp      ($4)
followed by "in"        ($5)
followed by another Exp ($6)

値を返しますLet $2 $4 $6$nパラメータは、各サブプロダクションの値に置き換えられます。したがって、このルールが一致する場合、Let関数 (おそらく何らかのデータ コンストラクター) は次のように呼び出されます。

  • var最初のパラメーターとしてのトークンの値、
  • 最初にExp解析された ($4) を 2 番目のパラメーターとして
  • Exp 2 番目は($6) を 3 番目のパラメーターとして解析します。

ここで、varトークンの値は変数名だと思います。

于 2016-05-23T20:38:01.407 に答える