考虑以下工作Alex源文件:
{
module Main (main) where
}
%wrapper "basic"
tokens :-
$white ;
. { rule "!"}
{
type Token = String
rule tok = \s -> tok
main = do
s <- getContents
mapM_ print (alexScanTokens s)
}
我希望在所有规则之前将我的帮助代码放在文件的顶部。我试过这样做:
{
module Main (main) where
}
%wrapper "basic"
{
type Token = String
rule tok = \s -> tok
}
tokens :-
$white ;
. { rule "!"}
{
main = do
s <- getContents
mapM_ print (alexScanTokens s)
}
但出现以下错误:
test.x:11:2: parse error
(第11行是我的助手代码之后的结束大括号)
有没有办法让我的助手代码更接近文件的顶部?
我还尝试将帮助程序代码与“模块主”声明一起放在第一个块中,但这不起作用,因为“%wrapper”位生成一些需要在第一个东西中出现的导入语句。生成的文件。
答案 0 :(得分:2)
“Alex文件的整体布局是:
alex := [ @code ] [ wrapper ] { macrodef } @id ':-' { rule } [ @code ]
在文件的顶部,代码片段通常用于声明模块名称和一些导入,这就是它应该做的全部:不要在顶部代码片段中声明任何函数或类型< / strong>,因为Alex可能需要将一些自己的导入注入到生成的词法分析器代码中,并且通过在输出文件中的此代码片段之后直接添加它们来实现此目的。“
因此,您尝试做的事情违反了语法。看来,您可以将Token
数据类型的定义放在最后的代码块中。
但是,如果您愿意,可以将此代码放在单独的模块中,并将import
放在顶部代码块中。