如何标记SSA

时间:2014-03-27 06:00:35

标签: c yacc lex ssa

参考How to tokenize String in Lex and Yacc但在这篇文章中我正在寻找整数令牌

当我收到输入时

a_2 = _6 + b_3;

在lex文件中我想获得a_2作为整数类型令牌,我如何在下面获取此令牌是我的lex文件

 %{
        /*
            parser for ssa;
        */

    #include<stdio.h>
    #include<stdlib.h>
    #include"y.tab.h"


    %}
    %%
    [\t]+   ;
    \n  ;



    "if"       printf("first input\n");
    "else"     return(op);
    "="        return(equal);
    "+"        return(op);
    "*"        return(op);
    "-"        return(op);

    [\<][b][b][ ]+[1-9][\>] {return(bblock);}

    ([[_][a-z]])|([a-z][_][0-9]+)|([0-9]+)  { yylval=atoi(yytext); return(var);}

    .   ;




    %%

这是在数字

中给出一些二进制值

1 个答案:

答案 0 :(得分:0)

这是一个简单但完整的示例,展示了使用union(yylval)处理整数和字符串的方法。请注意,我可能没有理解您的所有规则/正则表达式要求,但这应该让您开始。

Lexer文件:example.l

%{
#include "y.tab.h"
%}
SSAINTEGER [a-z\_0-9]*\_[0-9]+
%option noyywrap
%%
[0-9]+          { yylval.number = atoi(yytext); return NUMBER; }
{SSAINTEGER}    { yylval.string = strdup(yytext); return SSANUMBER; }
[ \t\n]+        /* eat up whitespace */
%%

解析器文件example.y

%{
#include<stdio.h>
void yyerror (char const *s) {
       fprintf (stderr, "%s\n", s);
}
%}
%union {
    char * string;
    int    number;
}
%type <string>  SSANUMBER
%type <number>  NUMBER
%token NUMBER SSANUMBER
%%

myinputs: myinput
        | myinput myinputs

myinput :       NUMBER    { printf("Number: %d\n", $1); }
        |       SSANUMBER { printf("SSA Number: %s\n", $1); }
        ;
%%
int main()
{
    return yyparse();
}