使用其他文件中的Alex宏

时间:2013-12-28 19:09:41

标签: haskell macros alex

有没有办法在一个源文件中定义Alex宏并在其他源文件中使用?就我而言,我有$LowerCaseLetter$UpperCaseLetter的定义(这些都是eO以外的所有字母,因为它们在我的代码中有特殊的作用)。如何从其他.x文件中引用这些宏?

1 个答案:

答案 0 :(得分:1)

反对存在的东西总是比找到确实存在的东西更难,但我认为下面的信息确实表明Alex只能从正在阅读的.x文件中获取宏定义(除了$white之类的预定义的东西),而不是来自其他文件的包括......

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

> cabal unpack alex
> cd alex-3.1.3

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

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

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

除了一些明显的预定义内容之外,我不认为词法分析器中的重用是典型的,因为在令牌级别,事情通常非常简单(通常是简单的令牌,如SPACEWORDNUMBER,以及一些操作符,符号和parens都是必需的。复杂性来自解析阶段,虽然由于技术原因,解析器包含也不常见(请参阅无扫描解析,以获得允许通过嵌套重用的新技术,例如嵌入在html中的javascript ....无扫描器的工具虽然解析仍然很原始。