查看源代码 epp_dodger (syntax_tools v3.2.1)
绕过 Erlang 预处理器。
这个模块对大多数 Erlang 源代码进行标记化和解析,而不扩展预处理器指令和宏应用,只要它们在语法上“行为良好”。因为 erl_parse
模块的普通解析树不能表示这些东西(通常,它们在解析器看到它们之前会被 Erlang 预处理器 //stdlib/epp
扩展),所以会创建一个扩展的语法树,使用 erl_syntax
模块。
摘要
函数
从 I/O 流读取和解析程序文本。
读取和解析文件。
从 I/O 流读取和解析单个程序形式。
类似于 parse/3
,但对代码进行更快速和粗略的处理。
类似于 parse_file/2
,但对代码进行更快速和粗略的处理。
类似于 parse_form/3
,但对代码进行更快速和粗略的处理。有关详细信息,请参阅 quick_parse_file/2
。
生成与给定标记序列对应的字符串。
类型
函数
-spec parse(file:io_device()) -> {ok, erl_syntax:forms()}.
等价于 parse(IODevice, 1)
。
-spec parse(file:io_device(), erl_anno:location()) -> {ok, erl_syntax:forms()}.
-spec parse(file:io_device(), erl_anno:location(), [option()]) -> {ok, erl_syntax:forms()}.
从 I/O 流读取和解析程序文本。
从 IODevice
读取字符直到文件末尾;除此之外,其行为与 parse_file/2
相同。StartLocation
是初始位置。
-spec parse_file(file:filename()) -> {ok, erl_syntax:forms()} | {error, errorinfo()}.
等价于 parse_file(File, [])
。
-spec parse_file(file:filename(), [option()]) -> {ok, erl_syntax:forms()} | {error, errorinfo()}.
读取和解析文件。
如果成功,则返回 {ok, Forms}
,其中 Forms
是表示文件“程序形式”的抽象语法树列表(请参阅 erl_syntax:is_form/1
)。否则,返回 {error, errorinfo()}
,通常是如果文件无法打开。请注意,解析错误在返回的形式列表中显示为错误标记;它们不会导致此函数失败或返回 {error, errorinfo()}
。
选项
{no_fail, boolean()}
- 如果为true
,这会使epp_dodger
将任何无法解析的程序形式替换为类型为text
的节点(请参阅erl_syntax:text/1
),表示该形式的原始标记序列,而不是报告解析错误。默认值为false
。{clever, boolean()}
- 如果设置为true
,这会使epp_dodger
在某些情况下尝试修复源代码,使其看起来合适,在其他情况下解析会失败。目前,它会在字符串文字和宏之间插入++
运算符,其中看起来像是打算进行连接。默认值为false
。
-spec parse_form(file:io_device(), erl_anno:location()) -> {ok, erl_syntax:forms(), erl_anno:location()} | {eof, erl_anno:location()} | {error, errorinfo(), erl_anno:location()}.
-spec parse_form(file:io_device(), erl_anno:location(), [option()]) -> {ok, erl_syntax:forms(), erl_anno:location()} | {eof, erl_anno:location()} | {error, errorinfo(), erl_anno:location()}.
从 I/O 流读取和解析单个程序形式。
从 IODevice
读取字符,直到找到表单结束标记(一个句点字符后跟空格),或直到文件末尾;除此之外,其行为类似于 parse/3
,不同之处在于返回值还包含给定 StartLocation
为初始位置时的最终位置,并且可以返回 {eof, Location}
。
-spec quick_parse(file:io_device()) -> {ok, erl_syntax:forms()}.
-spec quick_parse(file:io_device(), erl_anno:location()) -> {ok, erl_syntax:forms()}.
-spec quick_parse(file:io_device(), erl_anno:location(), [option()]) -> {ok, erl_syntax:forms()}.
类似于 parse/3
,但对代码进行更快速和粗略的处理。
有关详细信息,请参阅 quick_parse_file/2
。
另请参阅:parse/3
、quick_parse/2
、quick_parse_file/2
、quick_parse_form/2
。
-spec quick_parse_file(file:filename()) -> {ok, erl_syntax:forms()} | {error, errorinfo()}.
-spec quick_parse_file(file:filename(), [option()]) -> {ok, erl_syntax:forms()} | {error, errorinfo()}.
类似于 parse_file/2
,但对代码进行更快速和粗略的处理。
宏定义和其他预处理器指令将被丢弃,所有宏调用都将替换为原子。当只对代码的主要结构感兴趣,而不是细节时,这很有用。此外,快速解析方法通常可以处理比正常的、更精确的解析更多的奇怪情况。
选项:请参阅 parse_file/2
。但是,请注意,对于 quick_parse_file/2
,选项 no_fail
默认为 true
。
另请参阅:parse_file/2
、quick_parse/2
。
-spec quick_parse_form(file:io_device(), erl_anno:location()) -> {ok, erl_syntax:forms(), erl_anno:location()} | {eof, erl_anno:location()} | {error, errorinfo(), erl_anno:location()}.
-spec quick_parse_form(file:io_device(), erl_anno:location(), [option()]) -> {ok, erl_syntax:forms(), erl_anno:location()} | {eof, erl_anno:location()} | {error, errorinfo(), erl_anno:location()}.
类似于 parse_form/3
,但对代码进行更快速和粗略的处理。有关详细信息,请参阅 quick_parse_file/2
。
生成与给定标记序列对应的字符串。
字符串可以重新标记化以再次产生相同的标记列表。