【问题标题】:My result expected doesn't work in bison我的预期结果在野牛中不起作用
【发布时间】:2017-05-13 04:59:25
【问题描述】:

代码用于学习野牛和flex,我是新手,但我想学习处理它们。

我正在尝试运行这段代码,但我不知道错误出在哪里,因为编译器说没问题,但我不知道为什么我用数字 +573002597643 测试时会出现错误。这是一个有效的数字,因为我尝试遵守我的规则。

我的代码:

野牛:

%{
#include <stdio.h>
#include <stdlib.h>
extern int yylex();
extern int yyparse();
extern FILE* yyin;
void yyerror(const char* s);
%}

%union {
    int ival;
    float fval;
}

%token S_COL
%token<ival> I_AUX I_REGFIJO I_REGCEL I_NUMFIJO
%token T_NEWLINE T_QUIT


%start calculation

%%

calculation: T_NEWLINE
    | S_COL I_REGCEL I_AUX I_NUMFIJO{ printf("Number phone: \n"); }
    | S_COL I_REGFIJO I_REGFIJO I_NUMFIJO{ printf("Number local phone: \n"); }
    | T_QUIT T_NEWLINE { printf("bye!\n"); exit(0); }
;



%%
int main() {
    yyin = stdin;
    do { 
        yyparse();
    } while(!feof(yyin));
    return 0;
}
void yyerror(const char* s) {
    fprintf(stderr, "Parse error: %s\n", s);
    exit(1);
}

弹性文件

%option noyywrap

%{
#include <stdio.h>

#define YY_DECL int yylex()

#include "tel.tab.h"

%}

%%

[ \t]   ; // ignore all whitespace
\n  {return T_NEWLINE;}
[1-9]   {return I_REGFIJO;}
[0-9]   {return I_AUX;}
[3][0-9][0-9]   {return I_REGCEL;}
[\+][5][7]  {return S_COL;}
[0-9][0-9][0-9][0-9][0-9][0-9]  {return I_NUMFIJO;}
"exit"      {return T_QUIT;}
"quit"      {return T_QUIT;}


%%

【问题讨论】:

    标签: c bison flex-lexer bisonc++


    【解决方案1】:

    请注意,输入匹配多个模式,例如1 for

    [1-9]   {return I_REGFIJO;}
    [0-9]   {return I_AUX;}
    

    (和相同的长度)只有 first 动作被执行。你只会看到一个I_AUX 代表一个单独的0。如果匹配多个不同长度的模式,则采取最长匹配的操作(也称为“最大咀嚼规则”)。除此之外,我很难理解你需要什么。也许您可以将问题重新表述得更清楚?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-17
      • 2013-08-09
      • 1970-01-01
      相关资源
      最近更新 更多