我如何忽略 Lex 中的字符?
How do I ignore characters in Lex?
是否可以完全忽略 Lex 中的某些字符?任何排除字符的正则表达式都会分解这些字符出现的标记,而不是完全忽略它们。我知道忽略文本的分号规则;但是,稍后包括接受任何字符的正则表达式仍然接受先前声明为忽略的字符。让正则表达式忽略这些字符会导致它在遇到它们时破坏标记而不是跳过它们。
Is it possible to completely ignore certain characters in Lex?
不,原始 AT&T lex
实用程序没有任何支持此功能的功能,POSIX 也没有指定任何此类功能。输入从指定的流中读取,并直接与提供的模式匹配。从输入中获得的每个字符都要进行匹配——只有在 lex
读取它之前或它标记化之后才有机会处理字符内容。
编写一个规则集和相应的操作就像完全忽略某些指定字符一样,这是可能的,但是非常混乱。相反,您最好的办法是确保在 lex
看到它们之前删除有问题的字符。
对于传统和 POSIX lex
,数据是通过全局流指针 yyin
从指定给词法分析器的流中读取的。标准 C 不提供包装或内部过滤流的机制,但是您 可以 通过让您的程序 fork 插入外部过滤器, child 读取原始输入数据,剥离不需要的字符,并将其余字符通过管道传输到 parent 进程。同时,parent 将管道的读取端包装在流中(例如 fdopen()
),并将其分配给 yyin
.
另一方面,如果您使用 Flex 而不是传统的 lex
,那么您可以选择重新定义 YY_INPUT()
宏以在不需要的字符到达扫描仪之前过滤掉它们。这是lighter-weight而不是分叉,它可以在flex
的输入文件中表达,而不是要求使用扫描仪的程序设置过滤器。
然而,无论哪种方式,都没有 built-in 专门用于假装特定字符根本没有出现在输入中的功能。
是否可以完全忽略 Lex 中的某些字符?任何排除字符的正则表达式都会分解这些字符出现的标记,而不是完全忽略它们。我知道忽略文本的分号规则;但是,稍后包括接受任何字符的正则表达式仍然接受先前声明为忽略的字符。让正则表达式忽略这些字符会导致它在遇到它们时破坏标记而不是跳过它们。
Is it possible to completely ignore certain characters in Lex?
不,原始 AT&T lex
实用程序没有任何支持此功能的功能,POSIX 也没有指定任何此类功能。输入从指定的流中读取,并直接与提供的模式匹配。从输入中获得的每个字符都要进行匹配——只有在 lex
读取它之前或它标记化之后才有机会处理字符内容。
编写一个规则集和相应的操作就像完全忽略某些指定字符一样,这是可能的,但是非常混乱。相反,您最好的办法是确保在 lex
看到它们之前删除有问题的字符。
对于传统和 POSIX lex
,数据是通过全局流指针 yyin
从指定给词法分析器的流中读取的。标准 C 不提供包装或内部过滤流的机制,但是您 可以 通过让您的程序 fork 插入外部过滤器, child 读取原始输入数据,剥离不需要的字符,并将其余字符通过管道传输到 parent 进程。同时,parent 将管道的读取端包装在流中(例如 fdopen()
),并将其分配给 yyin
.
另一方面,如果您使用 Flex 而不是传统的 lex
,那么您可以选择重新定义 YY_INPUT()
宏以在不需要的字符到达扫描仪之前过滤掉它们。这是lighter-weight而不是分叉,它可以在flex
的输入文件中表达,而不是要求使用扫描仪的程序设置过滤器。
然而,无论哪种方式,都没有 built-in 专门用于假装特定字符根本没有出现在输入中的功能。