0

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

我的程序以 [something " something] 的形式接受其输入。这工作正常。

但是,我还需要接受 [something"something] 形式。

有没有一种方法可以让我在 lex 中有某种第一种情况,所有输入都通过(如预处理),然后在我的程序的其余部分继续进行相同的修改输入?

这就是我所说的:

%%
.* {
   do preprocessing
   }

something{
   return SOMETHING;
   }

\" {
   return QUOTE;
   }
%%
4

1 回答 1

1

好吧,您实际上可以在 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 个或多个字母、下划线和数字的内容。

这有帮助吗?

于 2009-03-24T18:03:28.967 回答