匹配一个字符串Lex的整数

时间:2014-03-27 11:38:01

标签: lex

需要匹配整数类型但它必须只是分隔整数。例如:

INTEGER (-?[0-9]+)
NOTENDLINE  [^$]
%%
{INTEGER}/{NOTENDLINE}     {}
%%

如果我输入类似" 23test"的字符串,则它必须是错误的并且没有匹配的整数。但我的解决方案并不是按需要工作。我不知道在NOTENDLINE中我需要什么。

2 个答案:

答案 0 :(得分:1)

这对你有用吗?它依赖于词法分析器将找到最长匹配规则的事实,但如果两个相等,则将使用第一个规则。

%option noyywrap
DIGIT   [0-9]
OTHER   [a-z0-9]*
%%
{DIGIT}+        printf( "Integer: %s (%d)\n", yytext, atoi( yytext ) );
{OTHER}         printf( "Other: %s\n", yytext );
[ \t\n]+        /* eat up whitespace */
%%
int main( int argc, char **argv )
{
        ++argv, --argc;  /* skip over program name */
        if ( argc > 0 )
                yyin = fopen( argv[0], "r" );
        else
                yyin = stdin;
        yylex();
}

示例输入(文件):

test
test123
123
123test

示例输出:

Other: test
Other: test123
Integer: 123 (123)
Other: 123test

答案 1 :(得分:0)

如果要匹配整数,但只有后跟空格,请直接执行:

-?[[:digit:]]+/[[:space:]]

如果整数位于没有换行符的文件的最末端,则会失败,但是文本文件不应该以换行符以外的任何内容结尾。但是,您可以执行以下操作:

-?[[:digit:]]+/[[:space:]]    { /* Handle an integer */ }
-?[[:digit:]]+/.              { /* Handle the error */ }
-?[[:digit:]]+                { /* Handle an integer; this one must be at EOF */ }