Throughout my development i've been manually running alex/happy to generate my parser files and then running ghci to test the code. This works fine and loads me into GHCI, but whenever I run cabal repl
the program throws an error in my Parser.hs
file.
The error is a type error: Couldn't match type '[a]' with 'Expression'
but whenever I'd been testing this code manually with ghci main
the code runs fine?
I'm not sure if I'm not fully understanding how cabal works but I've noticed that the haskell parser generated from happy, and from cabal are quite different.
I've attached the start of the error message for the cabal build command below.
Edit
So as pointed out by Alec whenever cabal build is ran it invokes happy with the -agc
flags, I wasn't aware for this and because of it my code needed tweaking.
The solution is to build the Happy parser with the -agc
flags and ensure it compiles that way. This may lead to some new errors within your parser as the resultant parsers differ slightly but from my research there is no way for cabal repl
to run with happy without the aforementioned flags.
PS D:\Documents\GitHub\solidiscan> cabal build
Preprocessing executable 'solidiscan' for solidiscan-0.1.0.0..
Building executable 'solidiscan' for solidiscan-0.1.0.0..
[3 of 6] Compiling Solidiscan.Parser ( dist\build\solidiscan\solidiscan-tmp\Solidiscan\Parser.hs, dist\build\solidiscan\solidiscan-tmp\Solidiscan\Parse
r.o )
dist\build\solidiscan\solidiscan-tmp\Solidiscan\Parser.hs:2429:42: error:
* Couldn't match type `[a]' with `Expression'
Expected type: HappyAbsSyn
[SourceUnit]
SourceUnit
[Char]
[Char]
Token
InheritanceSpec
InheritanceSpecifier
InheritanceSpecifier
[Expression]
Expression
[[Expression]]
[Expression]
[EnumValue]
EnumValue
[[EParameters]]
[EParameters]
EParameters
Token
[[Parameter]]
[Parameter]
Parameter
ReturnParam
[Expression]
Token
Token
PublicKeyword
[a]
[a]
[Expression]
Expression
TypeName
[Expression]
Expression
Expression
Expression
Expression
ElseState
Int
TypeName
ElemType
[Expression]
[ContractConts]
[EParameters]
[Expression]
[FuncMods]
[[Expression]]
[EnumValue]
[InheritanceSpecifier]
[Parameter]
[Expression]
[Token]
[PublicKeyword]
[ElseState]
[[[EParameters]]]
[[EParameters]]
[Expression]
[[Expression]]
[InheritanceSpec]
[Expression]
[[[Parameter]]]
[[Parameter]]
[ReturnParam]
[StorageLocation]
[Expression]
[ContractConts]
[EParameters]
[Expression]
[FuncMods]
[[Expression]]
[EnumValue]
[InheritanceSpecifier]
[Parameter]
[Expression]
-> HappyAbsSyn
[SourceUnit]
SourceUnit
[Char]
[Char]
Token
InheritanceSpec
InheritanceSpecifier
InheritanceSpecifier
[Expression]
Expression
[[Expression]]
[Expression]
[EnumValue]
EnumValue
[[EParameters]]
[EParameters]
EParameters
Token
[[Parameter]]
[Parameter]
Parameter
ReturnParam
[Expression]
Token
TypeName
PublicKeyword
[a]
Expression
[Expression]
Expression
TypeName
[Expression]
Expression
Expression
Expression
Expression
ElseState
Int
TypeName
ElemType
[Expression]
[ContractConts]
[EParameters]
[Expression]
[FuncMods]
[[Expression]]
[EnumValue]
[InheritanceSpecifier]
[Parameter]
[Expression]
[Token]
[PublicKeyword]
[ElseState]
[[[EParameters]]]
[[EParameters]]
[Expression]
[[Expression]]
[InheritanceSpec]
[Expression]
[[[Parameter]]]
[[Parameter]]
[ReturnParam]
[StorageLocation]
[Expression]
[ContractConts]
[EParameters]
[Expression]
[FuncMods]
[[Expression]]
[EnumValue]
[InheritanceSpecifier]
[Parameter]
[Expression]
Actual type: HappyAbsSyn
[SourceUnit]
SourceUnit
[Char]
[Char]
Token
InheritanceSpec
InheritanceSpecifier
InheritanceSpecifier
[Expression]
Expression
[[Expression]]
[Expression]
[EnumValue]
EnumValue
[[EParameters]]
[EParameters]
EParameters
Token
[[Parameter]]
[Parameter]
Parameter
ReturnParam
[Expression]
Token
Token
PublicKeyword
[a]
[a]
[Expression]
Expression
TypeName
[Expression]
Expression
Expression
Expression
Expression
ElseState
Int
TypeName
ElemType
[Expression]
[ContractConts]
[EParameters]
[Expression]
[FuncMods]
[[Expression]]
[EnumValue]
[InheritanceSpecifier]
[Parameter]
[Expression]
[Token]
[PublicKeyword]
[ElseState]
[[[EParameters]]]
[[EParameters]]
[Expression]
[[Expression]]
[InheritanceSpec]
[Expression]
[[[Parameter]]]
[[Parameter]]
[ReturnParam]
[StorageLocation]
[Expression]
[ContractConts]
[EParameters]
[Expression]
[FuncMods]
[[Expression]]
[EnumValue]
[InheritanceSpecifier]
[Parameter]
[Expression]
-> HappyAbsSyn
[SourceUnit]
SourceUnit
[Char]
[Char]
Token
InheritanceSpec
InheritanceSpecifier
InheritanceSpecifier
[Expression]
Expression
[[Expression]]
[Expression]
[EnumValue]
EnumValue
[[EParameters]]
[EParameters]
EParameters
Token
[[Parameter]]
[Parameter]
Parameter
ReturnParam
[Expression]
Token
TypeName
PublicKeyword
[a]
Expression
[Expression]
Expression
TypeName
[Expression]
Expression
Expression
Expression
Expression
ElseState
Int
TypeName
ElemType
[Expression]
[ContractConts]
[EParameters]
[Expression]
[FuncMods]
[[Expression]]
[EnumValue]
[InheritanceSpecifier]
[Parameter]
[Expression]
[Token]
[PublicKeyword]
[ElseState]
[[[EParameters]]]
[[EParameters]]
[Expression]
[[Expression]]
[InheritanceSpec]
[[a]]
[[[Parameter]]]
[[Parameter]]
[ReturnParam]
[StorageLocation]
[Expression]
[ContractConts]
[EParameters]
[Expression]
[FuncMods]
[[Expression]]
[EnumValue]
[InheritanceSpecifier]
[Parameter]
[Expression]
* In the second argument of `happySpecReduce_1', namely
`happyReduction_161'
In the expression: happySpecReduce_1 81# happyReduction_161
In an equation for `happyReduce_161':
happyReduce_161 = happySpecReduce_1 81# happyReduction_161
* Relevant bindings include
happyReduce_161 :: Happy_GHC_Exts.Int#
-> Token
-> Happy_GHC_Exts.Int#
-> Happy_IntList
-> HappyStk
(HappyAbsSyn
[SourceUnit]
SourceUnit
[Char]
[Char]
Token
InheritanceSpec
InheritanceSpecifier
InheritanceSpecifier
[Expression]
Expression
[[Expression]]
[Expression]
[EnumValue]
EnumValue
[[EParameters]]
[EParameters]
EParameters
Token
[[Parameter]]
[Parameter]
Parameter
ReturnParam
[Expression]
Token
TypeName
PublicKeyword
[a]
Expression
[Expression]
Expression
TypeName
[Expression]
Expression
Expression
Expression
Expression
ElseState
Int
TypeName
ElemType
[Expression]
[ContractConts]
[EParameters]
[Expression]
[FuncMods]
[[Expression]]
[EnumValue]
[InheritanceSpecifier]
[Parameter]
[Expression]
[Token]
[PublicKeyword]
[ElseState]
[[[EParameters]]]
[[EParameters]]
[Expression]
[[Expression]]
[InheritanceSpec]
[Expression]
[[[Parameter]]]
[[Parameter]]
[ReturnParam]
[StorageLocation]
[Expression]
[ContractConts]
[EParameters]
[Expression]
[FuncMods]
[[Expression]]
[EnumValue]
[InheritanceSpecifier]
[Parameter]
[Expression])
-> [Token]
-> HappyIdentity
(HappyAbsSyn
[SourceUnit]
SourceUnit
[Char]
[Char]
Token
InheritanceSpec
InheritanceSpecifier
InheritanceSpecifier
[Expression]
Expression
[[Expression]]
[Expression]
[EnumValue]
EnumValue
[[EParameters]]
[EParameters]
EParameters
Token
[[Parameter]]
[Parameter]
Parameter
ReturnParam
[Expression]
Token
TypeName
PublicKeyword
[a]
Expression
[Expression]
Expression
TypeName
[Expression]
Expression
Expression
Expression
Expression
ElseState
Int
TypeName
ElemType
[Expression]
[ContractConts]
[EParameters]
[Expression]
[FuncMods]
[[Expression]]
[EnumValue]
[InheritanceSpecifier]
[Parameter]
[Expression]
[Token]
[PublicKeyword]
[ElseState]
[[[EParameters]]]
[[EParameters]]
[Expression]
[[Expression]]
[InheritanceSpec]
[Expression]
[[[Parameter]]]
[[Parameter]]
[ReturnParam]
[StorageLocation]
[Expression]
[ContractConts]
[EParameters]
[Expression]
[FuncMods]
[[Expression]]
[EnumValue]
[InheritanceSpecifier]
[Parameter]
[Expression])
(bound at dist\build\solidiscan\solidiscan-tmp\Solidiscan\Parser.hs:2429:1)
|
2429 | happyReduce_161 = happySpecReduce_1 81# happyReduction_161
| ^^^^^^^^^^^^^^^^^^