Lex / Flex 中的启动状态

发布于 2024-07-26 13:06:32 字数 514 浏览 7 评论 0 原文

我使用 Flex 和 Bison 作为解析器生成器,但扫描仪中的启动状态出现问题。

我正在使用独占规则来处理注释,但此语法似乎与引用的标记不匹配:

%x COMMENT

//                    { BEGIN(COMMENT); }
<COMMENT>[^\n]        ;
<COMMENT>\n           { BEGIN(INITIAL); }

"=="                  { return EQUALEQUAL; }

.                     ;

在这个简单的示例中,该行:

// a == b

作为注释并不完全匹配,除非我包含此规则:

<COMMENT>"=="             ;

How do I get round无需将所有这些令牌添加到我的专有规则中?

I'm using Flex and Bison for a parser generator, but having problems with the start states in my scanner.

I'm using exclusive rules to deal with commenting, but this grammar doesn't seem to match quoted tokens:

%x COMMENT

//                    { BEGIN(COMMENT); }
<COMMENT>[^\n]        ;
<COMMENT>\n           { BEGIN(INITIAL); }

"=="                  { return EQUALEQUAL; }

.                     ;

In this simple example the line:

// a == b

isn't matched entirely as a comment, unless I include this rule:

<COMMENT>"=="             ;

How do I get round this without having to add all these tokens into my exclusive rules?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

如何视而不见 2024-08-02 13:06:32

在 Lex/Flex 或任何有据可查的内容中​​匹配 C 风格注释:

,以及互联网上的各种变体。

以下是 Flex 文档中的变体:

   <INITIAL>{
     "//"              BEGIN(IN_COMMENT);
     }
     <IN_COMMENT>{
     \n      BEGIN(INITIAL);
     [^\n]+    // eat comment
     "/"       // eat the lone /
     }

Matching C-style comments in Lex/Flex or whatever is well documented:

in the documentation, as well as various variations around the Internet.

Here is a variation on that found in the Flex documentation:

   <INITIAL>{
     "//"              BEGIN(IN_COMMENT);
     }
     <IN_COMMENT>{
     \n      BEGIN(INITIAL);
     [^\n]+    // eat comment
     "/"       // eat the lone /
     }
流年已逝 2024-08-02 13:06:32

尝试在 [^n] 规则后添加“+”。 我不知道为什么即使在独占状态下,独占状态仍然会出现“==”,但显然确实如此。 Flex 通常会匹配与最多文本匹配的规则,并且添加“+”至少会使两个规则的长度相等。 将 COMMENT 规则放在前面将导致在出现平局时使用它。

Try adding a "+" after the [^n] rule. I don't know why the exclusive state is still picking up '==' even in an exclusive state, but apparently it is. Flex will normally match the rule that matches the most text, and adding the "+" will at least make the two rules tie in length. Putting the COMMENT rule first will cause it to be used in case of a tie.

め七分饶幸 2024-08-02 13:06:32

线索是:

问题是这个“吃评论”
规则似乎与标记不匹配
多个字符

,因此添加一个 * 来匹配零个或多个非换行符。 您需要零,否则空注释将不匹配。

%x COMMENT

//                    { BEGIN(COMMENT); }
<COMMENT>[^\n]*        ;
<COMMENT>\n           { BEGIN(INITIAL); }

"=="                  { return EQUALEQUAL; }

.                     ;

The clue is:

The problem is this 'eat comment'
rule doesn't seem to match tokens with
more than one character

so add a * to match zero or more non-newlines. You want Zero otherwise a empty comment will not match.

%x COMMENT

//                    { BEGIN(COMMENT); }
<COMMENT>[^\n]*        ;
<COMMENT>\n           { BEGIN(INITIAL); }

"=="                  { return EQUALEQUAL; }

.                     ;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文