我在我的程序中使用lex而且遇到了一个我需要帮助的问题。
我的程序以[某事物]的形式接受其输入。这是正常的。
但是,我还需要接受[某事物]的形式。
有没有办法让我可以在lex中使用某种类型的第一个案例来运行所有输入(比如预处理),然后在我的程序的其余部分继续使用相同的修改后的输入?
这就是我所说的:
%%
.* {
do preprocessing
}
something{
return SOMETHING;
}
\" {
return QUOTE;
}
%%
答案 0 :(得分:1)
好吧,你实际上可以在lex中编写一个预处理器并将它放入你的构建系统中,但那可能过度了!
您可以使用开始条件,使用BEGIN在它们之间切换,然后先解析输入,然后使用unput将字符推回到流中,然后使用不同的开始条件来解析结果(请参阅the Flex manual)。< / p>
我最近为类似python的配置语言编写了一个解析器。解析器有两种模式(启动条件),一种用于计算行开头的制表符以确定作用域,另一种用于实际解析。
这些方法很好,但通常有更好的方法,特别是如果你的输入方案不是很复杂。
对于您的程序,[某事物]和[某事物]之间是否存在一个重要区别?一个空白饮食规则可以做到吗?
可以更多地描述你的语言和语法......?
评论后:
好的,基本上你有两个令牌,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或更多字母,下划线和数字。
这有帮助吗?