我目前正在使用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列。但根据我的理解,这应该正确解析?
答案 0 :(得分:1)
您将ProgSource
定义为单 SourceUnit
,因此解析器在遇到第二个时失败。我想你希望它是SourceUnit
s的列表。
同样适用于ContractPart
。
另外,您是不是要在"contract"
中引用ContractDefinition
?在同一制作中,$3
应为$4
。