自动词法分析器,LEX

编译原理作业——编制一个词法分析器。

显然做这个作业有两种途径,
1)自己编
2)google+biadu+others.

昨天Simon童鞋给我说他们让搞lex,好吧那我也正好凑凑热闹,嘿嘿。结果别说,还让我整出来了,lex简单应用语法还是很简单的,附上我的lex源程序,kaisir.l
(我这个wp的代码高亮不支持lex,大家凑合着看吧  我懒……)

[codesyntax lang=”c”]

%{
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
int lineno=1;
%}
letter [A-Z,a-z]
digit [0-9]
id ({letter}|_)({letter}|{digit}|_)*
error_id ({digit})+({letter})+
num {digit}+
whitespace [t]+
enter [n]+
%%
"int"|"if"|"else"|"return"|"void"|"while" {Upper(yytext,yyleng);
printf("%d 行  ",lineno);
printf("%s	reserved wordn",yytext);
}
{num} {
printf("%d 行  ",lineno);
printf("%s	NUMn",yytext);
}
","|";"|"("|")"|"+"|"-"|"*"|"/"|"=="|"<="|">="|"!="|"=" {printf("%d 行  ",lineno);
printf("%s	special symboln",yytext);
}
{id} {printf("%d 行  ",lineno);
printf("%s	IDn",yytext);
}
{error_id} {printf("%d 行  ",lineno);
printf("error:	%sn",yytext);
}
{whitespace} {
}
{enter} {lineno++;
}
%%
Upper(char *s,int l){
int i;
for(i=0;i<l;i++)
{s[i]=toupper(s[i]);}
}
//Main
main(void)
{
  char filename[400];
  printf("file name:");
  scanf("%s",&filename);
  yyin=fopen(filename,"r");
  printf("Starting..n");
  return yylex();
}

[/codesyntax]

在ubuntu下使用

flex kaisir.l

顺利通过,之后使用gcc对flex生存的lex.yy.c进行编译,结果报错如下:

kaisir@Kaisir-ubuntu:~$ gcc -g lex.yy.c -o a.out
test.txt: In function 鈓ain?
test.txt:49: warning: format ?s?expects type 鈉har *? but argument 2 has type 鈉har (*)[400]?
/tmp/ccmK1ARZ.o: In function `yylex’:
/home/kaisir/lex.yy.c:902: undefined reference to `yywrap’
/tmp/ccmK1ARZ.o: In function `input’:
/home/kaisir/lex.yy.c:1237: undefined reference to `yywrap’
collect2: ld returned 1 exit status

大体看了下说是yylex这个函数找不到,baidu了下,编译的时候增加参数“–lfl” 顺利编译通过,写了个Test.C进行词法分析,No Problem!

kaisir@Kaisir-ubuntu:~$ ./a.out hellolex.c
file name:hellolex.c
Starting..
1 行  VOID      reserved word
1 行  main     ID
1 行  ( special symbol
1 行  ) special symbol
{3 行  INT      reserved word
3 行  a        ID
3 行  ; special symbol
4 行  a ID
4 行  = special symbol
4 行  10        NUM
4 行  ; special symbol
5 行  printf    ID
5 行  ( special symbol
5 行  a ID
5 行  ) special symbol
5 行  ; special symbol
}

Flex系列之——初识Flex

最近有一个小项目,需要做一个基于Web的视频语音系统。我刚开始的想法就是使用C++之类的开发浏览器插件,用户访问时自动下载安装插件,之后使用Scoket进行网络传输。可是想想困难重重啊。这时候,我突然想起了之前提到的一个技术——Flex.

说起Flex,也是不是新兴的技术,早在Flash还属于Macromedia公司的时候,Flex就出现过1.0版本,后来随着互联网带宽的增加,Flex这种技术才慢慢变得广泛起来。对于Flex的介绍,大家还是自行Google吧,或者移步这里

我这个Flex系列打算主要写这样几篇日志:

1)Flex系列之——初识Flex

2)Flex系列之——说说Flex与FMS

3)Flex系列之——Stratus的故事

4)Flex系列之——与.Net不得不说的故事

当然,这篇就是系列之一咯,在大家开始我们的Flex之旅之前,希望大家能够做做准备工作哈,也不是特别多,主要有以下几点:

1)下载 Adobe Flash Builder 4(出于版权,下载地址我就不提供了,大家就自己找下吧 嘿嘿)

2)下载Adobe Flash Media Server(FMS)这个可以使用开发版,不要钱,但是最多只支持10个链接。点此下载

3)申请一个Stratus Key(开发者密钥 用于链接Adobe的Stratus服务器)点此申请

4)如果你不想让你的开发过程更简单点的话,建议安装Flash Player插件(Debug版)点此下载

嘿嘿 如果你都准备好了,剩下的,就是慢慢等我的后续日志咯。或者自己百度下,特别推荐以下两个链接做为参考资料:

Link1:http://www.flextheworld.com/flex-4-flash-builder-4-quick-guide

Link2:http://www.cnblogs.com/aierong/archive/2008/12/30/Flex.html#sp