快乐解析错误

时间:2018-02-01 16:05:26

标签: parsing haskell happy alex

我目前正在使用alex和happy lexer / parser生成器为以太坊智能合约语言的可靠性实现解析器。目前我使用简化语法来简化初始开发。

我在解析合同时遇到了错误。我的测试合同文件的一部分。

以下是语法的代码:

ProgSource   :: { ProgSource }
ProgSource   : SourceUnit                  { ProgSource $1 }

SourceUnit   : PragmaDirective             { SourceUnit $1}

PragmaDirective : "pragma" ident ";"       {Pragma $2 }
                | {- empty -}              { [] }

ImportDirective : 
                "import" stringLiteral ";"  { ImportDir $2 }

ContractDefinition : contract ident "{" ContractPart "}"  { Contract $2 $3 }

ContractPart : StateVarDecl                   { ContractPart $1 }

StateVarDecl : TypeName "public" ident ";"    { StateVar $1 $3 }
                         | TypeName "public" ident "=" Expression ";"       { StateV $1 $3 $5 }

以下文件是我的合同':

pragma solidity;
contract identifier12 {
   public variable = 1;
}

结果是将我的测试合同传递给我的解析器的main函数。

$ cat test.txt | ./main
main: Parse error at TContract (AlexPn 17 2 1)2:1
CallStack (from HasCallStack):
    error, called at ./Parser.hs:232:3 in main:Parser

从错误中可以看出问题是合同的第一个字母'令牌,在第2行第1列。但根据我的理解,这应该正确解析?

1 个答案:

答案 0 :(得分:1)

您将ProgSource定义为 SourceUnit,因此解析器在遇到第二个时失败。我想你希望它是SourceUnit s的列表。

同样适用于ContractPart

另外,您是不是要在"contract"中引用ContractDefinition?在同一制作中,$3应为$4