有没有办法在一个源文件中定义Alex宏并在其他源文件中使用?就我而言,我有$LowerCaseLetter
和$UpperCaseLetter
的定义(这些都是e
和O
以外的所有字母,因为它们在我的代码中有特殊的作用)。如何从其他.x
文件中引用这些宏?
答案 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 }
除了一些明显的预定义内容之外,我不认为词法分析器中的重用是典型的,因为在令牌级别,事情通常非常简单(通常是简单的令牌,如SPACE
,WORD
,NUMBER
,以及一些操作符,符号和parens都是必需的。复杂性来自解析阶段,虽然由于技术原因,解析器包含也不常见(请参阅无扫描解析,以获得允许通过嵌套重用的新技术,例如嵌入在html中的javascript ....无扫描器的工具虽然解析仍然很原始。