首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >haskell alex:导入时出现解析错误?

haskell alex:导入时出现解析错误?
EN

Stack Overflow用户
提问于 2013-10-07 17:50:03
回答 1查看 3.2K关注 0票数 1

我刚刚开始学习haskell和alex/happy,因为我想写一个解析器。然而,我遇到了这个问题:

来源:lexp.x

代码语言:javascript
复制
{
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)

}

并得到了:

代码语言:javascript
复制
\->>> alex lexer.x && ghc lexer.hs
[1 of 1] Compiling ValkenLexer      ( lexer.hs, lexer.o )

lexer.hs:15:1: parse error on input `import'

我做错了什么?

EN

回答 1

Stack Overflow用户

发布于 2013-10-07 22:27:37

正如Daniel Wagner预测的那样,函数定义需要放在页脚上。只能将模块声明和导入语句放在头部。此外,您需要将TokStr strip(s)更改为TokStr (strip s)

代码语言:javascript
复制
{
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)
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19221641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档