0

我在快乐的解析器中有这个语法部分,在快乐的官方网站上给出,但我需要更深入地解释括号中规则的含义。这是令牌定义

%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 指的是第二个规则参数,依此类推,但如果有人能给我一个规则的“人工阅读版本”,我会非常高兴。希望我已经清楚了。

提前致谢。

4

2 回答 2

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)作为第二个参数
  • 第二个解析Exp ($6)作为第三个参数。

我相信这里var令牌的值是变量名。

于 2016-05-23T20:38:01.407 回答
1

在该%token部分中,左列是语法中其他地方使用的标记名称,右列是可以在case语句中使用的模式。你在哪里看到$$Happy 将替换它自己的变量。因此,如果生成的解析器在某个时刻期待一个整数,那么 Happy 将有一个带有模式的 case 语句,TokenInt v1234其中该v1234位是由 Happy 创建的变量名。

“Let”是要识别的语法表达式的构造函数。如果您在示例页面中看起来稍低一些,您会看到

data Exp  
    = Let String Exp Exp
    | Exp1 Exp1
    deriving Show

所以Let构造函数接受一个字符串和两个子表达式(类型为“Exp”)。如果您查看语法,您会发现let规则中有六个元素。第一个只是常量字符串“let”。生成的解析器使用它来确定它正在查看“let”子句,但生成的解析树不需要它。所以$1不会出现。相反,Let构造函数的第一个参数必须是被绑定变量的名称,这是语法规则中的第二项。因此这是$2. 其他的东西是两个子表达式,它们是$4$6按照同样的逻辑。这两个都可以是任意复杂的表达式:Happy 找出它们的开始和结束位置,并通过遵循其他规则来解析它们,以确定表达式的构成。

于 2016-05-23T20:41:03.977 回答