Haskell的情况有误

时间:2012-12-23 23:46:11

标签: haskell case

我必须做一个软件来识别C中的令牌。我有这个代码:

*main = do
   x <- readFile "progc.c"
   let resultado = lexCmm X
   print resultado
lexCmm :: String -> [Tok]
  lexCmm X = case X of
    c:cs   | isSpace c     -> lexCmm cs
    c:cs   | isAlpha c     -> getId s
    c:cs   | isDigit c     -> getInt s
    c:d:cs | isSymb [c,d]  -> TS [c,d] : lexCmm cs
    c:cs   | isSymb [c]    -> TS [c]   : lexCmm cs
    _                      -> []  
   where
    getId s  = lx i : lexCmm cs where (i,cs) = span isIdChar s
    getInt s = TI (read i) : lexCmm cs where (i,cs) = span isDigit s
    isIdChar c = isAlpha c || isDigit c
    lx i = if isReservedWord i then TS i else TI i

  isSymb s = elem s $ words "++ -- == <= >= ++ { } = , ; + * - ( ) < >"

  isReservedWord w = elem w $ words "else if int main printInt return while"*

错误是:

file:{Hugs}\prog.hs:7 - Syntax error in input (unexpected `=')

2 个答案:

答案 0 :(得分:4)

除了上面提到的变量名大写X的错误之外,还有缩进错误,lexCmm的定义方程是缩进的,但它应该从最左边开始列。

如果你取消该行

lexCmm :: String -> [Tok]
lexCmm x = case x of

以及isSymbisReservedWord的定义,您还会遇到其他一些错误。

case表达式的替代方法必须比case关键字缩进。

c:cs   | isAlpha c     -> getId s
c:cs   | isDigit c     -> getInt s

您使用不在范围内的实体s(因此您可能应该将lexCmm的参数更改为s,或将这两个s更改为{{1 }}

x

强烈建议getInt s = TI (read i) : lexCmm cs where (i,cs) = span isDigit s 的构造函数TI采用Tok参数,但

Int

尝试将其应用于lx i = if isReservedWord i then TS i else TI i 。你可能想要String

以下代码包含TI (read i)类型的快速模型编译:

Tok

答案 1 :(得分:1)

Haskell变量必须以小写字母开头。以大写字母开头的标识符被解释为类型。

大写X可能会导致您遇到问题:

  lexCmm X = case X of

在这里你混合了大写x

  x <- readFile "progc.c"
  let resultado = lexCmm X

用小写x替换所有这些可能会解决您的问题。