其实lex也可以做语法分析,只是复杂很多
打个比方:%{
#include <stdio.h>
int a;
int op=0;
%}
%%
[0-9]+ {
if(op==0){
sscanf(yytext,"%d",&a);
} else {
int b;
sscanf(yytext,"%d",&b);
switch(op) {
case 1:
printf("%d\n",a+b);
break;
case 2:
printf("%d\n",a-b);
break;
case 3:
printf("%d\n",a*b);
break;
case 4:
printf("%d\n",a/b);
break;
default:
break;
}
op=0;
}
}
"+" {op=1;}
"-" {op=2;}
"*" {op=3;}
"/" {op=4;}
[\t \n]+ ;
. ;
%%
int main()
{
yylex();
return 0;
}
linux-0gt0:/tmp # flex test.l ; gcc lex.yy.c -ll ; ./a.out
1 + 1
2
11 * 12
132
以下程序和上面的功能一样,看起来更像lex程序:)
%{
#include <stdio.h>
int a;
int op=0;
%}
%s ADD SUB MUL DIV
%%
<ADD>[0-9]+ {
int tmp;
sscanf(yytext,"%d",&tmp);
printf("%d\n",a+tmp);
BEGIN INITIAL;
}
<SUB>[0-9]+ {
int tmp;
sscanf(yytext,"%d",&tmp);
printf("%d\n",a-tmp);
BEGIN INITIAL;
}
<MUL>[0-9]+ {
int tmp;
sscanf(yytext,"%d",&tmp);
printf("%d\n",a*tmp);
BEGIN INITIAL;
}
<DIV>[0-9]+ {
int tmp;
sscanf(yytext,"%d",&tmp);
printf("%d\n",a/tmp);
BEGIN INITIAL;
}
[0-9]+ {sscanf(yytext,"%d",&a);}
"+" {BEGIN ADD;}
"-" {BEGIN SUB;}
"*" {BEGIN MUL;}
"/" {BEGIN DIV;}
[\t \n]+ ;
. ;
%%
int main()
{
yylex();
return 0;
}
[ 本帖最后由 cjaizss 于 2008-2-13 17:32 编辑 ] 以上只是简单的不带括号的四则运算
如果涉及到带括号的运算,则更加困难 flex 就是做语法分析的,不知道你想说什么. 原帖由 SST中国 于 2008-2-11 20:10 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
flex 就是做语法分析的,不知道你想说什么.
不懂lex/yacc,不懂编译原理就不要瞎说 原帖由 cjaizss 于 2008-2-11 20:43 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
不懂lex/yacc,不懂编译原理就不要瞎说
那我想听听你有何见解. Lex - A Lexical Analyzer Generator
难道不是词法分析?
flex 就是做语法分析的,不知道你想说什么.
Lex - A Lexical Analyzer Generator
难道不是词法分析?
以上两句是你一个人说的 http://www.cppblog.com/FongLuo/archive/2008/02/04/42505.html
用“词法状态”实现的和LZ一样的功能?
[ 本帖最后由 cjaizss 于 2008-2-13 17:34 编辑 ]
回复 #8 yecheng_110 的帖子
呵呵,正是,以上我再用状态改写一下,让其更像lex不好意思,点了编辑:( 一般来说,语法分析比词法分析更难是因为语法有递归结构。
所以,语法分析器说到底可以做词法分析,但是反过来却很困难。
页:
[1]
2