有没有办法在一个源文件中定义一个 Alex 宏并在其他源文件中使用?就我而言,我有$LowerCaseLetter
and的定义$UpperCaseLetter
(这些都是字母,除了e
and O
,因为它们在我的代码中具有特殊的作用)。如何从其他.x
文件中引用这些宏?
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 ......解析仍然很原始)。