我刚刚开始学习haskell和alex/happy,因为我想写一个解析器。然而,我遇到了这个问题:
来源:lexp.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+ ;
$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'我做错了什么?
发布于 2013-10-07 22:27:37
正如Daniel Wagner预测的那样,函数定义需要放在页脚上。只能将模块声明和导入语句放在头部。此外,您需要将TokStr strip(s)更改为TokStr (strip s)
{
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)
}https://stackoverflow.com/questions/19221641
复制相似问题