Haskell 使用其他文件中的Alex宏

Haskell 使用其他文件中的Alex宏,haskell,macros,alex,Haskell,Macros,Alex,有没有办法在一个源文件中定义Alex宏并在其他源文件中使用?在我的例子中,我有$LowerCaseLetter和$UpperCaseLetter的定义(这些都是字母,除了e和O,因为它们在我的代码中有特殊的角色)。如何从其他.x文件中引用这些宏?反驳存在的东西总是比找到确实存在的东西更难,但我认为下面的信息确实表明Alex只能从它正在读取的.x文件中获取宏定义(而不是预定义的东西,如$white),而不是通过其他文件中的包含 您可以通过执行以下操作获取Alex的源代码: > cabal u

有没有办法在一个源文件中定义Alex宏并在其他源文件中使用?在我的例子中,我有
$LowerCaseLetter
$UpperCaseLetter
的定义(这些都是字母,除了
e
O
,因为它们在我的代码中有特殊的角色)。如何从其他
.x
文件中引用这些宏?

反驳存在的东西总是比找到确实存在的东西更难,但我认为下面的信息确实表明Alex只能从它正在读取的.x文件中获取宏定义(而不是预定义的东西,如
$white
),而不是通过其他文件中的包含

您可以通过执行以下操作获取Alex的源代码:

> cabal unpack alex
> cd alex-3.1.3
在src/Main.hs中,预定义宏首先在名为
initSetEnv
的变量中设置(charset宏
$white
$printable
和“.”)和
initREEnv
(regexp宏,没有)。它被传递到runP中,位于src/ParseMonad.hs中,用于保存当前解析状态,包括所有定义的宏。初始状态是使用传入的值设置的,但是可以使用名为
newSMac
的函数添加宏(对于正则表达式宏,可以使用
newRMac

由于这似乎是可以设置宏的唯一方法,因此只需要一些grep簿记来验证可以添加宏的唯一方法是通过source.x文件中的实际宏定义。不出所料,Alex递归地使用自己的.x/.y文件进行.x源文件解析(src/parser.y,src/Scan.x)。这需要几个级别的间接寻址,但是您可以验证调用
newSMac
的唯一方法是通过src/Scan.x宏

@smac   = \$ @id | \$ \{ @id \}
<0> @smac @ws? \=       { smacdef }
@smac=\$@id \$\{@id\}
@smac@ws?\={smacdef}


除了一些明显的预定义内容外,我不认为lexer中的重用是典型的,因为在标记级别上,事情通常非常简单(通常是简单的标记,如
空格
单词
数字
,以及一些操作符、符号和paren都是需要的)。复杂性出现在解析阶段,尽管出于技术原因,解析器包含也不太常见(参见无扫描解析,了解一种通过嵌套实现重用的新技术,如嵌入html中的javascript….无扫描解析工具仍然非常原始).

您的意思是为Adobe/Apache UI框架Flex添加标签吗?@Reboog711我没有。我应该在添加标签之前阅读说明。标签
Flex Lexer
用于词法分析器;这通常被错误地标记为
flex
。然而,我对它的了解还不够,不知道这是否适合你的问题。祝你好运!