1

我一直在寻找一种不符合一般 Flex/Bison 范式的语言。根据语义上下文,它具有完全不同的令牌规则。例如:

main() {
    batchblock
    {
echo Hello World!
set batchvar=Something
echo %batchvar%
    }
}

Bison 显然支持对这些类型的语法的识别,但它需要“ Lexical Tie Ins ”来有效地支持它们。它为此提供了一个接口——但我对如何根据上下文提供不同的弹性正则表达式感到困惑——如果这是可能的话。

提前致谢 :)

4

2 回答 2

2
我对如何根据上下文提供不同的弹性正则表达式感到困惑

Flex 有一个状态机制,您可以通过它在不同的正则表达式集之间进行切换。这个的语法是

%x name_of_state

在文件顶部(在 之后%})和匹配规则中(在第一个之后%%

<name_of_state> *regex goes here*

那么这个正则表达式只有在那个状态下才匹配。还有一个全局状态<*>可以用来匹配任何状态的任何东西。

改变状态的方法不止一种。例如,yy_pop_state如果yy_push_state你想保留一堆状态。或者,您可以使用BEGIN(name_of_state). 要返回初始状态,请使用BEGIN(INITIAL).

于 2009-10-19T15:30:42.030 回答
1

就目前而言,具体而言,如果您的特殊块始终由'batchblock {'发出信号,则可以完全在flex内部处理——在Bison(或byacc,如果你想让你的生活至少更轻松一点)方面,您只会看到更改为“BATCH_ECHO”之类的标记。

要在 flex 中处理它,您可以使用它的启动条件功能:

%x batchblock
%%

"batchblock"{ws}\{   { BEGIN(batchblock); }


<batchblock>echo     { return BATCH_ECHO; }
<batchblock>set      { return BATCH_SET;  }
/* ... */
<batchblock>\}       { begin(INITIAL);    }

以 开头的模式<batchblock>只能在“batchblock”状态下匹配,该状态由BEGIN(batchblock);.

于 2009-10-19T15:39:52.030 回答