1

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

4

1 回答 1

1

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

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

> cabal unpack alex
> cd alex-3.1.3

在 src/Main.hs 中,预定义的宏首先设置在名为initSetEnv(charset macros $white, $printable, and ".") 和initREEnv(regexp macros, there are none) 的变量中。这被传递到 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 }

除了一些明显的预定义的东西,我不相信词法分析器中的重用是典型的,因为在令牌级别,事情通常非常简单(通常是简单的令牌,如SPACE, WORD, NUMBER,以及一些运算符、符号和括号需要)。复杂性出现在解析阶段,尽管出于技术原因,解析器包含也不是那么常见(请参阅无扫描器解析以获得允许通过嵌套重用的新技术,例如嵌入在 html 中的 javascript ......解析仍然很原始)。

于 2013-12-28T21:32:04.393 回答