Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 我如何忽略Lex中的角色?_C_Lex - Fatal编程技术网

C 我如何忽略Lex中的角色?

C 我如何忽略Lex中的角色?,c,lex,C,Lex,是否可以完全忽略Lex中的某些字符?任何不包括字符的正则表达式都会将出现这些字符的标记分开,而不是完全忽略它们。我知道分号规则,其中文本被忽略;但是,包括稍后接受任何字符的正则表达式,仍然接受以前声明为忽略的字符。让正则表达式忽略这些字符会导致它在遇到它们时中断令牌,而不是跳过它们 是否可以完全忽略Lex中的某些字符 不,原始的AT&Tlex实用程序没有任何支持此功能的功能,POSIX也没有指定任何此类功能。从指定的流读取输入,并直接与提供的模式匹配。从输入中获得的每个字符都要进行匹配——只有在

是否可以完全忽略Lex中的某些字符?任何不包括字符的正则表达式都会将出现这些字符的标记分开,而不是完全忽略它们。我知道分号规则,其中文本被忽略;但是,包括稍后接受任何字符的正则表达式,仍然接受以前声明为忽略的字符。让正则表达式忽略这些字符会导致它在遇到它们时中断令牌,而不是跳过它们

是否可以完全忽略Lex中的某些字符

不,原始的AT&T
lex
实用程序没有任何支持此功能的功能,POSIX也没有指定任何此类功能。从指定的流读取输入,并直接与提供的模式匹配。从输入中获得的每个字符都要进行匹配——只有在
lex
读入它之前或在它标记之后,才有机会篡改字符内容

编写一个规则集和相应的操作,就好像完全忽略了某个指定的字符一样,这是可能的,但非常混乱。相反,您最好的办法是确保在
lex
看到这些角色之前,将它们去掉

使用传统和POSIX
lex
,通过全局流指针
yyin
从指定给lexer的流中读取数据。标准C不提供包装或内部过滤流的机制,但您可以通过让程序分叉插入外部过滤器,让子进程读取原始输入数据,剥离不需要的字符,并将其余的传输到父进程。同时,父级将管道的读取端包装在流中(
fdopen()
),并将其分配给
yyin

另一方面,如果您使用Flex而不是传统的
lex
,那么您可以选择重新定义宏,在不需要的字符到达扫描仪之前过滤掉它们。这比分叉更轻,可以在
flex
的输入文件中表示,而不需要使用扫描仪的程序设置过滤器


但是,无论哪种方式,都没有专门用于假装输入中根本没有出现特定字符的内置功能。

您可以将
YY_输入
重新定义为跳过这些字符的自定义输入函数。您是否仅限于POSIX
lex
的功能集,或者你可以假设你的
lex
实际上是GNU
flex
?@JohnBollinger,我目前正在使用
lex
,但是如果
flex
比重新定义
YY\u输入更容易,我可以改变,因为它甚至没有
YY\u输入,至少不是作为一个文档化的特性。这是flex特有的。但可能性相当高,尤其是在Linux上,您的
lex
实际上已经是
flex
。这就是我要问的,以及你是否同意成为
flex
特定的人。至少后者的答案似乎是“是”。@JohnBollinger,在这种情况下,我对
flex
特定的代码没有意见。
popen
可能是一个更简单的过滤器解决方案,只要您使用的是Posix(-like)系统。(如果没有,也可能没有
fork