簡體   English   中英

快樂解析錯誤

[英]Happy Parse Error

我目前正在使用alex和高興的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;
}

結果是將測試合同傳遞到解析器的主要功能中。

$ 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列。但是據我理解,這應該正確解析嗎?

您將ProgSource定義為單個 SourceUnit ,因此在遇到第二個解析器時解析器將失敗。 我想您希望它成為SourceUnit的列表。

這同樣適用於ContractPart

另外,您不是要在ContractDefinition引用"contract"嗎? 在同一生產中, $3應該是$4

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM