【问题标题】:Is there a way to put Haskell code before the token rules in an Alex source file?有没有办法将 Haskell 代码放在 Alex 源文件中的令牌规则之前?
【发布时间】:2013-08-26 17:53:43
【问题描述】:

考虑以下工作,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”位会生成一些需要作为第一件事出现的导入语句生成的文件。

【问题讨论】:

    标签: haskell alex


    【解决方案1】:

    引用documentation of Alex:

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

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

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

    因此,您尝试执行的操作违反了语法。看来您可以将Token 数据类型的定义放在最后的代码块中的唯一位置。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-02
      • 2021-02-22
      • 1970-01-01
      相关资源
      最近更新 更多