命令在lex中落空

时间:2009-03-24 17:32:22

标签: lex fall-through

我在我的程序中使用lex而且遇到了一个我需要帮助的问题。

我的程序以[某事物]的形式接受其输入。这是正常的。

但是,我还需要接受[某事物]的形式。

有没有办法让我可以在lex中使用某种类型的第一个案例来运行所有输入(比如预处理),然后在我的程序的其余部分继续使用相同的修改后的输入?

这就是我所说的:

%%
.* {
   do preprocessing
   }

something{
   return SOMETHING;
   }

\" {
   return QUOTE;
   }
%%

1 个答案:

答案 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或更多字母,下划线和数字。

这有帮助吗?