2014-03-27 32 views
0

How to tokenize String in Lex and Yacc但在這篇文章中我找的整數標記如何參照記號化SSA

當我在lex文件中獲取輸入

a_2 = _6 + b_3; 

我想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);} 

    . ; 




    %% 

這是在數字給一些二進制值

+0

你需要把標識符作爲一個字符串,而不是一個整數。所以,你的語法可以仔細地訪問'yytext',或者你可以設置一個更復雜的'YYSTYPE',它有一個類型的聯合;整數的整數,以及標識符的字符串。 (順便說一句:您應該可以診斷何時放棄無法識別的輸入 - 「。」規則應該有一個標識何時被調用的動作。) –

+0

SSA與這個問題有什麼關係? – leppie

+0

您是否試圖從令牌中解析出整數(例如a_9 => 9)並將其存儲在yylval中或保留原始字符串標記並將其放入yylval中? – emsworth

回答

0

這是一個簡單但完整的示例,展示了使用聯合(yylval)處理整數和字符串的方法。請注意,我可能沒有理解您的所有規則/正則表達式要求,但這應該讓您開始。

詞法文件: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(); 
}