Flex / Bison:配置 yylineno 以将 '\r' 识别为换行符
Flex / Bison: Configure yylineno to recognize '\r' as newline
有没有办法 configure/modify yylineno
将单个 \r
(回车 return)字符识别为换行符?
最终,我想对 3 种不同类型的文件使用 yylineno
:
\n
:类 Unix
\r\n
:基于Windows(将被识别为单个换行符,而不是两个,即\r
+ \n
)
\r
:例如经典 Mac OS
我知道我可以定义自己的变量来跟踪 Flex 中的行号并在每次找到换行符 (\r|\n|\r\n)
时递增它,但我更愿意使用内置的 Flex 功能(如果可用)。
谢谢。
坏消息是 flex 没有那个特性。行计数根本不可配置,它依赖于模式的静态分析来查看哪些可能匹配换行符。如果换行序列的长度超过一个字节,那将是不可能的,因为换行序列可以拆分为两个单独的标记。 (如果您要实现自己的行计数器,请确保考虑到这一事实。最简单的解决方案是确保令牌不可能在 \r\n
序列中的 \r
之后结束.)
好消息是现在以 \r
结尾的文件非常少见。所以不处理它们的成本可能并不大。
有没有办法 configure/modify yylineno
将单个 \r
(回车 return)字符识别为换行符?
最终,我想对 3 种不同类型的文件使用 yylineno
:
\n
:类 Unix\r\n
:基于Windows(将被识别为单个换行符,而不是两个,即\r
+\n
)\r
:例如经典 Mac OS
我知道我可以定义自己的变量来跟踪 Flex 中的行号并在每次找到换行符 (\r|\n|\r\n)
时递增它,但我更愿意使用内置的 Flex 功能(如果可用)。
谢谢。
坏消息是 flex 没有那个特性。行计数根本不可配置,它依赖于模式的静态分析来查看哪些可能匹配换行符。如果换行序列的长度超过一个字节,那将是不可能的,因为换行序列可以拆分为两个单独的标记。 (如果您要实现自己的行计数器,请确保考虑到这一事实。最简单的解决方案是确保令牌不可能在 \r\n
序列中的 \r
之后结束.)
好消息是现在以 \r
结尾的文件非常少见。所以不处理它们的成本可能并不大。