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