0

考虑以下有效的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 行是我的帮助代码之后的右花括号)

有没有办法将我的帮助代码移近文件顶部?

我还尝试将帮助程序代码与“module Main”声明一起放在第一个块中,但这不起作用,因为“%wrapper”位会生成一些导入语句,这些语句需要在生成的文件中作为第一件事出现。

4

1 回答 1

3

引用Alex 的文档

“一个 Alex 文件的整体布局是:

alex := [ @code ] [ wrapper ] { macrodef } @id ':-' { rule } [ @code ]

在文件的顶部,代码片段通常用于声明模块名称和一些导入,这就是它应该做的:不要在顶部代码片段中声明任何函数或类型,因为 Alex 可能需要注入它自己的一些导入到生成的词法分析器代码中,它通过在输出文件中的这个代码片段之后直接添加它们来做到这一点。”

因此,您尝试执行的操作违反了语法。似乎唯一可以放置Token数据类型定义的地方是最后的代码块。

但是,如果您愿意,可以将此代码放在单独的模块中,并将import其放在顶部代码块中。

于 2013-08-26T18:45:39.773 回答