c - Flex 和 Bison 的词汇搭配

标签 c bison lex flex-lexer

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

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

Bison 显然支持识别这些类型的语法,但它需要“Lexical Tie Ins”才能有效支持它们。它提供了一个用于执行此操作的接口(interface)——但我对如何根据上下文提供不同的 flex 正则表达式感到困惑——如果这可能的话。

提前致谢:)

最佳答案

I'm confused as to how exactly I can supply different flex regexes depending on the context

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

%x name_of_state

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

<name_of_state> *regex goes here*

那么这个正则表达式只有在那个状态下才会被匹配。还有一个全局状态 <*>可用于匹配任何状态下的任何内容。

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

关于c - Flex 和 Bison 的词汇搭配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1589165/

相关文章:

Cloudant 的 C SDK?

C 程序错误 - 段错误(核心已转储)

c - getpid() 返回意外值

链表删除元素函数的C实现

Xcode 使用不同的 Bison

bison - 我应该如何处理 Flex 词法分析器中的词法错误?

c++ - 使用 flex/yacc 编写 C++ 编译器需要多少时间?

c++ - 如何使用 flex 和 bison 解析非常大的缓冲区

Erlang、yecc 和 EBNF

regex - 正则表达式中的空格