0

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

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

以下是语法的代码:

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;
}

结果是将我的测试合同传递给我的解析器的主要功能。

$ 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 列上的“合同”令牌的第一个字母。但据我了解,这应该正确解析吗?

4

1 回答 1

1

您定义ProgSourcesingle SourceUnit,因此在遇到第二个时解析器将失败。我猜你希望它是一个SourceUnits 列表。

这同样适用于ContractPart

"contract"另外,你不是要引用ContractDefinition吗?而在同一个生产中,$3应该是$4.

于 2018-02-01T16:25:47.140 回答