flex中的模式

时间:2013-11-24 13:57:55

标签: flex-lexer

我想在flex中编写一个与以下内容等效的规则: symbol = lowercase | digit |其他。 我定义了这些规则:

SYMBOL {LOWERCASE}|{DIGIT}|{OTHER}
ALPHABET SYMBOL+
LOWERCASE [a-z]
DIGIT [0-9]
OTHER [!#$%-./:;<>=?@\[\]^'~]
%%

  /* SYMBOL */
SYMBOL  {
        printf("Symbol found: %s",yytext);
        }

%%

如果输入是&#34; something123。&#34;它没有被解析。 即使我在OTHER之后定义符号,也无法识别符号。

如果我更改代码:

SYMBOL {LOWERCASE}|{DIGIT}|{OTHER}
ALPHABET SYMBOL+
LOWERCASE [a-z]
DIGIT [0-9]
OTHER [!#$%-./:;<>=?@\[\]^'~]
%%

  /* SYMBOL */
{LOWERCASE}|{DIGIT}|{OTHER}  {
                             printf("Symbol found: %s",yytext);
                             }
%%

它有效。 难道不能用{LOWERCASE} | {DIGIT} | {OTHER}替换符号吗? [类似于C的定义]

LE: 问题解决了: %%之间的一些规则%% flex正在搜索完全匹配。所以它搜索SYMBOL就像一个简单的单词而不是模式SYMBOL。解决方案(指定模式):用{SYMBOL}替换SYMBOL。 所以现在它起作用了:

SYMBOL {LOWERCASE}|{DIGIT}|{OTHER}
ALPHABET SYMBOL+
LOWERCASE [a-z]
DIGIT [0-9]
OTHER [!#$%-./:;<>=?@\[\]^'~]
%%

  /* SYMBOL */
{SYMBOL}  {
        printf("Symbol found: %s",yytext);
        }

1 个答案:

答案 0 :(得分:0)

(通过复制和粘贴来回答社区Wiki以关闭问题:Question with no answers, but issue solved in the comments (or extended in chat)

LE:问题解决了:%%之间的某些规则%% flex正在搜索完全匹配。所以它搜索SYMBOL就像一个简单的单词而不是模式SYMBOL。解决方案(指定模式):用{SYMBOL}替换SYMBOL。所以现在它起作用了:

SYMBOL {LOWERCASE}|{DIGIT}|{OTHER}
ALPHABET SYMBOL+
LOWERCASE [a-z]
DIGIT [0-9]
OTHER [!#$%-./:;<>=?@\[\]^'~]
%%

  /* SYMBOL */
{SYMBOL}  {
        printf("Symbol found: %s",yytext);
        }