好吧,您实际上可以在 lex 中编写一个预处理器并将其放入您的构建系统中,但这可能是矫枉过正!
您可以使用开始条件,使用 BEGIN 在它们之间切换,并首先解析输入,然后使用 unput 将字符推回流中,然后可以使用不同的开始条件来解析结果(参见Flex 手册)。
我最近为类似 python 的配置语言编写了一个解析器,它就是这样做的。解析器有两种模式(开始条件),一种是在行首计算制表符以确定范围,另一种是进行实际解析。
这些方法很好,但通常有更好的方法,特别是如果您的输入方案不是非常复杂。
对于您的程序,[something "something] 和 [something"something] 之间是否存在语法差异?空白饮食规则可以解决问题吗?
能多描述一下你的语言和语法吗……?
评论后:
好的,所以基本上你有两个标记,SOMETHING 和 QUOTE。如果您的令牌由空格分隔,您可以执行以下操作:
%%
\" {
//this will match a single quote
return QUOTE;
}
[^" \t\n\r]+ {
//this will match a run of anything thats not a quote, space, tab or line ending
return SOMETHING;
}
[ \t\n\r] {
//do nothing: i.e. ignore whitespace
}
%%
对于您的 SOMETHING 令牌,您还可以匹配类似[A-Za-z_][A-Za-z0-9_]*
字母或下划线后跟 0 个或多个字母、下划线和数字的内容。
这有帮助吗?