我必须做一个软件来识别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 `=')
答案 0 :(得分:4)
除了上面提到的变量名大写X
的错误之外,还有缩进错误,lexCmm
的定义方程是缩进的,但它应该从最左边开始列。
如果你取消该行
lexCmm :: String -> [Tok]
lexCmm x = case x of
以及isSymb
和isReservedWord
的定义,您还会遇到其他一些错误。
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
替换所有这些可能会解决您的问题。