haskell alex:导入时分析错误?
我刚开始学习haskell和alex/happy,因为我想写一个解析器。但是,我遇到了这个问题: 资料来源:lexer.xhaskell alex:导入时分析错误?,haskell,Haskell,我刚开始学习haskell和alex/happy,因为我想写一个解析器。但是,我遇到了这个问题: 资料来源:lexer.x { module ValkenLexer where strip :: String -> String strip s = take ((length s) - 2) (drop 1 s) } %wrapper "basic" $digit = 0-9 $alpha = [a-zA-Z] tokens :- $white+
{
module ValkenLexer where
strip :: String -> String
strip s = take ((length s) - 2) (drop 1 s)
}
%wrapper "basic"
$digit = 0-9
$alpha = [a-zA-Z]
tokens :-
$white+ ;
$alpha+ { \s -> TokIdent s }
\"[^\"]*\" { \s -> TokStr strip(s) }
= { \s -> TokSlash}
\| { \s -> TokPipe }
\/ { \s -> TokSlash }
\n { \s -> TokEol}
\%$alpha+ { \s -> TokVar (drop 1 s)}
{
data Token = TokIdent String
| TokStr String
| TokEq
| TokPipe
| TokSlash
| TokEol
| TokVar String
deriving (Eq,Show)
}
得到:
\->>> alex lexer.x && ghc lexer.hs
[1 of 1] Compiling ValkenLexer ( lexer.hs, lexer.o )
lexer.hs:15:1: parse error on input `import'
我做错了什么?正如Daniel Wagner预测的那样,函数定义需要放在页脚上。您只能将模块声明和导入语句放在标题上。此外,您需要将
TokStr条带
更改为TokStr条带
它一定生成了一个名为
lexer.hs
的文件,请猜测一下该文件的内容,对alex一无所知:可能它生成了一些导入,但将它们放在你的条定义之后;但在Haskell文件中,导入必须放在第一位。将strip
的定义移到页脚。谢谢,但我认为在生成的文件中,导入是第一位的。有空我会查一下time@user1528601到时候告诉我。我给你的代码在我测试时运行良好。
{
module ValkenLexer where
}
%wrapper "basic"
$digit = 0-9
$alpha = [a-zA-Z]
tokens :-
$white+ ;
$alpha+ { \s -> TokIdent s }
\"[^\"]*\" { \s -> TokStr (strip s) }
= { \s -> TokSlash}
\| { \s -> TokPipe }
\/ { \s -> TokSlash }
\n { \s -> TokEol}
\%$alpha+ { \s -> TokVar (drop 1 s)}
{
strip :: String -> String
strip s = take ((length s) - 2) (drop 1 s)
data Token = TokIdent String
| TokStr String
| TokEq
| TokPipe
| TokSlash
| TokEol
| TokVar String
deriving (Eq,Show)
}