Flex
Flex是一个生成词法分析器的工具,它可以利用正则表达式来生成匹配相应字符串的C语言代码,其语法格式基本同Lex相同。
格式
LEX的源文件由三个部份组成,每个部分之间用顶行的 `%%’ 分割,其格式如下:
定义部份
%%
规则部份
%%
用户附加C语言部份
手册->Flex, version 2.5
怎么用就不赘述了…
主要就是用这个词法生成器,给输入的源文件中的每一个关键字打上tag,以便后面的语法分析器能够识别.
GNU Bison
GNU bison 是属于 GNU 项目的一个语法分析器生成器。Bison 把一个关于“向前查看 从左到右 最右 `LALR’ 上下文无关文法的描述转化成可以分析该文法的 C 或 C++ 程序。它也可以为二义文法生成 “通用的 从左到右 最右 `(GLR)’ 语法分析器。
这里主要使用的就是普通的LALR…
手册->Bison 3.0.5
格式
与flex的格式大致相同…
声明部分
%%
语法规则
%%
C语言附加部分
源码
flex 部分
/* filename -> scanner.l */
%option noyywrap yylineno
%{
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "parser.tab.h"
int old_status;
void yyerror(char *s, ...);
%}
%x COMMENT
%%
/* 下面都是正则表达式 */
int { return INT; }
float { return FLOAT; }
double { return DOUBLE; }
auto { return AUTO; }
break { return BREAK; }
case { return CASE; }
const { return CONST; }
else { return ELSE; }
for { return FOR; }
if { return IF; }
long { return LONG; }
return { return RETURN; }
short { return SHORT; }
signed { return SIGNED; }
char { return CHAR; }
unsigned { return UNSIGNED; }
/* user variable */
[a-zA-Z][a-zA-Z0-9_]* { yylval.strval = strdup(yytext); return IDENTITY; }
/* integer numbers */
-?[0-9]+ { yylval.intval = atoi(yytext); return INT_NUMBER; }
-?[0-9]+\.[0-9]+ { yylval.floatval = atof(yytext); return FLOAT_NUMBER; }
/* real numbers */
\"(\\.|\"\"|[^"\n"])*\" { yylval.strval = strdup(yytext); return STRING; }
/* C-type strings */
\"(\\.|[^"\n])*$ { yyerror("Unterminated string %s", yytext); }
/* operators */
[-+&~|^/%*(),.;!] { return yytext[0]; }
"&&" { return AND; }
"||" { return OR; }
"=" { return ASSIGN; }
/* comments */
"//".*;
"/*" { old_status = YY_START; BEGIN COMMENT; }
<COMMENT>"*/" { BEGIN old_status; }
/* space & tab */
[ \t\n]
/* prevent flex jam */
. { yyerror("something goes wrong...\n"); }
%%
##Bison 部分
/* filename -> parser.y */
%require "3.0.4"
%{
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
void yyerror(char *s, ...);
int yylex();
%}
%debug
%locations
%union {
int intval;
double floatval;
char *strval;
int subtok;
}
/* token 关键字 */
%token INT
%token FLOAT
%token DOUBLE
%token AUTO
%token BREAK
%token CASE
%token CONST
%token ELSE
%token FOR
%token IF
%token LONG
%token RETURN
%token SHORT
%token SIGNED
%token CHA