[英]Alex requies the result token type to be some function that takes a AlexPosn
我正在嘗試編寫一個詞法分析器,它可以對 c 樣式的注釋進行詞法分析,而沒有別的(目前)。
{
module Lexer where
import Prelude hiding (head, take, tail)
import Data.ByteString.Lazy
}
%wrapper "monad-bytestring"
@not_bc_end = ~\* | \* ~\/
tl :-
<0> $white+ ;
<0> "/*" { tok (\p s -> BCBegin p) `andBegin` bc }
<bc> .+ / not_bc_end { tok (\p s -> BCContent p s) }
<bc> "*/" { tok (\p s -> BCEnd p) `andBegin` 0 }
<0> "//" { tok (\p s -> LCBegin p) `andBegin` lc }
<lc> .*$ { tok (\p s -> LCContent p s) }
{
tok :: (AlexPosn -> ByteString -> Token) -> AlexInput -> Int64 -> Alex Token
tok f (p, _, bs, _) len = pure $ f p (take len bs)
data Token
= LCBegin AlexPosn
| LCContent AlexPosn ByteString
| BCBegin AlexPosn
| BCEnd AlexPosn
| BCContent AlexPosn ByteString
| End AlexPosn
alexEOF = pure End
}
代碼生成成功,但編譯失敗並出現以下錯誤:
templates/wrappers.hs:288:9: error:
• Couldn't match type ‘Token’ with ‘AlexPosn -> Token’
Expected type: Alex (AlexPosn -> Token)
Actual type: Alex Token
• In a stmt of a 'do' block: action (ignorePendingBytes inp__) len
In the expression:
do alexSetInput inp__'
action (ignorePendingBytes inp__) len
In the expression:
let len = n' - n
in
do alexSetInput inp__'
action (ignorePendingBytes inp__) len
編譯器抱怨令牌類型(包裝在Alex
)必須采用AlexPosn
類型的參數。 我糊塗了,因為已經有一個AlexPosn
在AlexInput
和用戶指南明確指出,令牌類型可卜什么,只要他們保持在所有相同的標記。
將tok
的定義更改為以下解決了問題:
tok :: (AlexPosn -> ByteString -> Token) -> AlexInput -> Int64 -> Alex (AlexPron -> Token)
tok f (_, _, bs, _) len = pure $ \p -> f p (take len bs)
但我不知道為什么亞歷克斯把令牌AlexPosn
一個亞歷克斯AlexPosn
我不小心在構造函數中添加了一個AlexPosn
類型的字段End
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.