编译原理是我在大学学习计算机时感受的最牛的计算机科学理论。
若论使用算法的密集度,OS和compiler是不能比的。OS中使用的技术用的算法并不高深,构造一个kernel更像是一个工程,而构造一个compiler更像是一个艺术作品,程序设计的艺术。
楼主的程序只是做了简单的C词法分析,编译理论对词法分析进行了透彻的研究,从正则到DFA构造很简单,从DFA到词法分析程序的编写也没有什么技术含量可言。在这方面的算法研究使得写一个词法分析程序已经程式化了,这种枯燥无味的过程往往借助lex进行自动生成,就想现在的IDE可以自动生成SQL语句一样。
BockCarry能在本科时做一个完整的编译器我很佩服,做到中间代码生成我就没有耐心了,寄存器分配以及后面的生成可执行程序我觉得太枯燥已经做不下去了。 [quote][bo]以下是引用 [un]RockCarry[/un] 在 2008-5-15 09:49 的发言:[/bo]
原来如此,加油吧,希望你能做得更好。不过程序好像无法运行,代码也打不开啊。如果是做编译器,我想借助 lex & yacc 是最好的办法,编译器构造技术的复杂程度你也许还没有认识到,一个人如果不借助工具,要想完成具有实用价值的编 ... [/quote]
偶换了一个编译模式,现在这个版本应该运行上没有问题了
顺便想了一个办法,把它做得更通用。
我很清楚地知道制作编译器有多么复杂,所以我目前也只做语法高亮
[img]http://blog.programfan.com/upfile/200804/20080430094836.gif[/img][color=white] [quote][bo]以下是引用 [un]VxWorks[/un] 在 2008-5-15 10:44 的发言:[/bo]
顶BockCarry
编译原理是我在大学学习计算机时感受的最牛的计算机科学理论。
若论使用算法的密集度,OS和compiler是不能比的。OS中使用的技术用的算法并不高深,构造一个kernel更像是一个工程,而构造一个compiler更像是一 ... [/quote]
过奖了,我的作品也不过是一个试验品,也并没有最终生成目标代码,生成的结果是四元式形式的中间代码,没有做代码优化,就直接写了一个虚拟机,使其可以直接运行编译生成的四元式。所以说来还是有点惭愧了,其实做的也不是很好,基本上没有什么实用价值。 我以前做了一个解释运行的编译器,类似于JAVA,是半编译半解释的…………不过后来失败了的说,主要是LR文法的构造问题……………………
话说,半编译半解释的编译器还是很好做的,因为没有代码优化和寄存器分配………………
回复 128# 的帖子
嘿嘿,我和你一样,只不过生成的是不等长的后缀表达式………… 顶起[img]http://blog.programfan.com/upfile/200804/20080430094836.gif[/img][color=white] 不过还是觉得vc6的语法高亮看上去最爽。。。 你是说字体还是什么??
[img]http://blog.programfan.com/upfile/200804/20080430094836.gif[/img][color=white] [tk05] 这个不错`~本来我也想做一下~~一直没时间~~ [tk06] 飞燕姐~~那代码的解压密码是什么呀?~~
不知道如何解压~~ 既然发了代码怎么又不发解压密码? 源代码需要密码才能解压 /*****************************************************************
** HighlightCodeV3.0 software by yzfy(雨中飞燕) [url]http://yzfy.org[/url] **
*****************************************************************/
#include <cstdio>
#include <vector>
#include <deque>
using namespace std;
//-----------------------------------------------
typedef struct road // list
{
int v;
road *next;
}road;
//-----------------------------------------------
vector<road> vec;
const int N = 10005;
int level[N];
//-----------------------------------------------
void Join( int v, int w ) // add edge
{
road *p = new road;
p->v = w;
p->next = vec[v].next; vec[v].next = p;
}
//-----------------------------------------------
void bfs( int s, int e ) //bfs
{
deque<int> q;
q.push_back(s);
while( !q.empty() )
{
int t = q[0];
road *p = vec[t].next;
while( p != NULL )
{
if( level[p->v] || p->v == s ) { p = p->next; continue; }
level[p->v] = level[t] + 1;
if( p->v == e ) break;
q.push_back( p->v ); p = p->next;
}
q.pop_front(); delete p;
}
q.clear();
}
//-----------------------------------------------
int main()
{
int n, k, i;
while( scanf( "%d%d", &n, &k ), n || k ) // input
{
for( i = 0; i <= n; i++ ) // init
{
road r;
r.v = i; r.next = NULL;
vec.push_back( r ); level[[i][/i]i] = 0;
}
for( i = 0; i < k; i++ ) // input and add edge
{
int a, b;
scanf( "%d%d", &a, &b );
Join( a, b ); Join( b, a );
}
int s, e;
scanf( "%d%d", &s, &e );
if( s == e ) { puts("0"); vec.clear(); continue; }
bfs( s, e );
if( level[e] == 0 ) puts( "No solution" ); // output
else printf( "%d\n", level[e] - 1 );
vec.clear();
}
return 0;
} #include <cstdio>
const int MAX=30;
int a[MAX][MAX];
void s(int x, int y, int m) {
int r=0, t=0, i;
while(true) {
for(i=r; i<=y; i++)
a[r][i]=++t;
if(t==m)
break;
r++;
for(i=r; i<=x; i++)
a[i][y]=++t;
if(t==m)
break;
for(i=y-1; i>=r-1; i--)
a[x][i]=++t;
if(t==m)
break;
x--;
for(i=x; i>=r; i--)
a[i][r-1]=++t;
if(t==m)
break;
y--;
}
}
void n(int x, int y, int m) {
int r=0, t=0, i;
while(true) {
for(i=r; i<=x; i++)
a[i][r]=++t;
if(t==m)
break;
r++;
for(i=r; i<=y; i++)
a[x][i]=++t;
if(t==m)
break;
for(i=x-1; i>=r-1; i--)
a[i][y]=++t;
if(t==m)
break;
x--;
for(i=y-1; i>=r; i--)
a[r-1][i]=++t;
if(t==m)
break;
y--;
}
}
int main() {
int x, y, t, m;
while(scanf("%d%d%d",&x,&y,&t) != EOF) {
m=x*y;
if(t)
s(--y,--x,m);
else
n(--y,--x,m);
for(t=0; t<=y; t++) {
for(m=0; m<=x; m++)
printf("%4d", a[t][m]);
printf("\n");
}
printf("\n");
}
return 0;
}
#include "stdio.h"
int main()
{
int i,j,t;
while(scanf("%d%d%d",&i,&j,&t)!=EOF){
int n=1,h=0,s=0, k[31][31]={{},{}};
while(!t){
k[h][s]=n++;
if(h<=(i+1)/2 && s<j-1 && k[h][s+1]==0 && (h<1 ||k[h-1][s]!=0))s++;
else if((s>=(j/2)) && h<i-1 && k[h+1][s]==0)h++;
else if(s>0 && k[h][s-1]==0)s--;
else if(h>0 && k[h-1][s]==0)h--;
else break;
}
while(t){
k[h][s]=n++;
if(s<=(j+1)/2 && h<i-1 && k[h+1][s]==0 && (s<1 || k[h][s-1]!=0))h++;
else if(h>=(i/2)&& s<j-1 && k[h][s+1]==0)s++;
else if(h>0 && k[h-1][s]==0)h--;
else if(s>0 && k[h][s-1]==0)s--;
else break;
}
for(s=0;s<j;s++){
for(h=0;h<i;h++){
printf("%4d",k[h][s]);
}
printf("\n");
}
printf("\n");
}
return 0;
}
#include "stdio.h"
int main()
{
int i,j,t;
while(scanf("%d%d%d",&j,&i,&t)!=EOF){
int n=1,h=0,s=0, k[31][31]={{},{}};
i--;j--;
while(t){
k[s][h]=n++;
if((h>=s || k[s-1][h]!=0) && h<j && k[s][h+1]==0 )h++;
else if( s<i && k[s+1][h]==0)s++;
else if( h>0 && k[s][h-1]==0)h--;
else if( s>0 && k[s-1][h]==0)s--;
else break;
}
while(!t){
k[s][h]=n++;
if((s>=h || k[s][h-1]!=0) && s<i && k[s+1][h]==0 )s++;
else if( h<j && k[s][h+1]==0)h++;
else if( s>0 && k[s-1][h]==0)s--;
else if( h>0 && k[s][h-1]==0)h--;
else break;
}
for(s=0;s<=i;s++){
for(h=0;h<=j;h++){
printf("%4d",k[s][h]);
}
printf("\n");
}
printf("\n");
}
return 0;
} [quote][font=新宋体][size=2][color=#008000]/*****************************************************************
** HighlightCodeV3.0 software by yzfy(雨中飞燕) [url]http://yzfy.org[/url] **
*****************************************************************/
[/color][color=#FF0000]#include <stdio.h>
[/color][color=#FF0000]#include <conio.h>
[/color][color=#0000FF]int [/color][color=#FF0000]main[/color]()
[color=#800000]{
[/color][color=#FF0000]printf[/color]([color=#FF00FF]"Computer Science"[/color]);
[color=#008080]getch[/color]();
[color=#0000FF]return [/color][color=#800080]0[/color];
[color=#800000]}
[/color][/size][/font][/quote]
[tk44] [tk44]
原来真的是要除了代码,还得加点儿东西才能"不小于3个字符"!!!!!!!!
[[it] 本帖最后由 wzhings 于 2008-5-25 01:02 编辑 [/it]]
[[it] 本帖最后由 wzhings 于 2008-5-25 01:03 编辑 [/it]] [quote][font=新宋体][size=2][color=#008000]/*****************************************************************
** HighlightCodeV3.0 software by yzfy(雨中飞燕) [url]http://yzfy.org[/url] **
*****************************************************************/
[/color][color=#FF0000]#include <cstdio>
[/color][color=#0000FF]const int [/color][color=#800080]MAX[/color]=[color=#800080]30[/color];
[color=#0000FF]int [/color]a[color=#800000][[/color][color=#800080]MAX[/color][color=#800000]][[/color][color=#800080]MAX[/color][color=#800000]][/color];
[color=#0000FF]void [/color][color=#008080]s[/color]([color=#0000FF]int [/color]x, [color=#0000FF]int [/color]y, [color=#0000FF]int [/color]m) [color=#800000]{
[/color][color=#0000FF]int [/color]r=[color=#800080]0[/color], t=[color=#800080]0[/color], i;
[color=#0000FF]while[/color](true) [color=#800000]{
[/color][color=#0000FF]for[/color](i=r; i<=y; i++)
a[color=#800000][[/color]r[color=#800000]][[/color]i[color=#800000]][/color]=++t;
[color=#0000FF]if[/color](t==m)
[color=#0000FF]break[/color];
r++;
[color=#0000FF]for[/color](i=r; i<=x; i++)
a[color=#800000][[/color]i[color=#800000]][[/color]y[color=#800000]][/color]=++t;
[color=#0000FF]if[/color](t==m)
[color=#0000FF]break[/color];
[color=#0000FF]for[/color](i=y-[color=#800080]1[/color]; i>=r-[color=#800080]1[/color]; i--)
a[color=#800000][[/color]x[color=#800000]][[/color]i[color=#800000]][/color]=++t;
[color=#0000FF]if[/color](t==m)
[color=#0000FF]break[/color];
x--;
[color=#0000FF]for[/color](i=x; i>=r; i--)
a[color=#800000][[/color]i[color=#800000]][[/color]r-[color=#800080]1[/color][color=#800000]][/color]=++t;
[color=#0000FF]if[/color](t==m)
[color=#0000FF]break[/color];
y--;
[color=#800000]}
}
[/color][color=#0000FF]void [/color][color=#008080]n[/color]([color=#0000FF]int [/color]x, [color=#0000FF]int [/color]y, [color=#0000FF]int [/color]m) [color=#800000]{
[/color][color=#0000FF]int [/color]r=[color=#800080]0[/color], t=[color=#800080]0[/color], i;
[color=#0000FF]while[/color](true) [color=#800000]{
[/color][color=#0000FF]for[/color](i=r; i<=x; i++)
a[color=#800000][[/color]i[color=#800000]][[/color]r[color=#800000]][/color]=++t;
[color=#0000FF]if[/color](t==m)
[color=#0000FF]break[/color];
r++;
[color=#0000FF]for[/color](i=r; i<=y; i++)
a[color=#800000][[/color]x[color=#800000]][[/color]i[color=#800000]][/color]=++t;
[color=#0000FF]if[/color](t==m)
[color=#0000FF]break[/color];
[color=#0000FF]for[/color](i=x-[color=#800080]1[/color]; i>=r-[color=#800080]1[/color]; i--)
a[color=#800000][[/color]i[color=#800000]][[/color]y[color=#800000]][/color]=++t;
[color=#0000FF]if[/color](t==m)
[color=#0000FF]break[/color];
x--;
[color=#0000FF]for[/color](i=y-[color=#800080]1[/color]; i>=r; i--)
a[color=#800000][[/color]r-[color=#800080]1[/color][color=#800000]][[/color]i[color=#800000]][/color]=++t;
[color=#0000FF]if[/color](t==m)
[color=#0000FF]break[/color];
y--;
[color=#800000]}
}
[/color][color=#0000FF]int [/color][color=#FF0000]main[/color]() [color=#800000]{
[/color][color=#0000FF]int [/color]x, y, t, m;
[color=#0000FF]while[/color]([color=#FF0000]scanf[/color]([color=#FF00FF]"%d%d%d"[/color],&x,&y,&t) != [color=#800080]EOF[/color]) [color=#800000]{
[/color]m=x*y;
[color=#0000FF]if[/color](t)
[color=#008080]s[/color](--y,--x,m);
[color=#0000FF]else
[/color][color=#008080]n[/color](--y,--x,m);
[color=#0000FF]for[/color](t=[color=#800080]0[/color]; t<=y; t++) [color=#800000]{
[/color][color=#0000FF]for[/color](m=[color=#800080]0[/color]; m<=x; m++)
[color=#FF0000]printf[/color]([color=#FF00FF]"%4d"[/color], a[color=#800000][[/color]t[color=#800000]][[/color]m[color=#800000]][/color]);
[color=#FF0000]printf[/color]([color=#FF00FF]"\n"[/color]);
[color=#800000]}
[/color][color=#FF0000]printf[/color]([color=#FF00FF]"\n"[/color]);
[color=#800000]}
[/color][color=#0000FF]return [/color][color=#800080]0[/color];
[color=#800000]}
[/color][color=#FF0000]#include [/color][color=#FF00FF]"stdio.h"
[/color][color=#0000FF]int [/color][color=#FF0000]main[/color]()
[color=#800000]{
[/color][color=#0000FF]int [/color]i,j,t;
[color=#0000FF]while[/color]([color=#FF0000]scanf[/color]([color=#FF00FF]"%d%d%d"[/color],&i,&j,&t)!=[color=#800080]EOF[/color])[color=#800000]{
[/color][color=#0000FF]int [/color]n=[color=#800080]1[/color],h=[color=#800080]0[/color],s=[color=#800080]0[/color], k[color=#800000][[/color][color=#800080]31[/color][color=#800000]][[/color][color=#800080]31[/color][color=#800000]][/color]=[color=#800000]{{}[/color],[color=#800000]{}}[/color];
[color=#0000FF]while[/color](!t)[color=#800000]{
[/color]k[color=#800000][[/color]h[color=#800000]][[/color]s[color=#800000]][/color]=n++;
[color=#0000FF]if[/color](h<=(i+[color=#800080]1[/color])/[color=#800080]2 [/color]&& s<j-[color=#800080]1 [/color]&& k[color=#800000][[/color]h[color=#800000]][[/color]s+[color=#800080]1[/color][color=#800000]][/color]==[color=#800080]0 [/color]&& (h<[color=#800080]1 [/color]||k[color=#800000][[/color]h-[color=#800080]1[/color][color=#800000]][[/color]s[color=#800000]][/color]!=[color=#800080]0[/color]))s++;
[color=#0000FF]else if[/color]((s>=(j/[color=#800080]2[/color])) && h<i-[color=#800080]1 [/color]&& k[color=#800000][[/color]h+[color=#800080]1[/color][color=#800000]][[/color]s[color=#800000]][/color]==[color=#800080]0[/color])h++;
[color=#0000FF]else if[/color](s>[color=#800080]0 [/color]&& k[color=#800000][[/color]h[color=#800000]][[/color]s-[color=#800080]1[/color][color=#800000]][/color]==[color=#800080]0[/color])s--;
[color=#0000FF]else if[/color](h>[color=#800080]0 [/color]&& k[color=#800000][[/color]h-[color=#800080]1[/color][color=#800000]][[/color]s[color=#800000]][/color]==[color=#800080]0[/color])h--;
[color=#0000FF]else break[/color];
[color=#800000]}
[/color][color=#0000FF]while[/color](t)[color=#800000]{
[/color]k[color=#800000][[/color]h[color=#800000]][[/color]s[color=#800000]][/color]=n++;
[color=#0000FF]if[/color](s<=(j+[color=#800080]1[/color])/[color=#800080]2 [/color]&& h<i-[color=#800080]1 [/color]&& k[color=#800000][[/color]h+[color=#800080]1[/color][color=#800000]][[/color]s[color=#800000]][/color]==[color=#800080]0 [/color]&& (s<[color=#800080]1 [/color]|| k[color=#800000][[/color]h[color=#800000]][[/color]s-[color=#800080]1[/color][color=#800000]][/color]!=[color=#800080]0[/color]))h++;
[color=#0000FF]else if[/color](h>=(i/[color=#800080]2[/color])&& s<j-[color=#800080]1 [/color]&& k[color=#800000][[/color]h[color=#800000]][[/color]s+[color=#800080]1[/color][color=#800000]][/color]==[color=#800080]0[/color])s++;
[color=#0000FF]else if[/color](h>[color=#800080]0 [/color]&& k[color=#800000][[/color]h-[color=#800080]1[/color][color=#800000]][[/color]s[color=#800000]][/color]==[color=#800080]0[/color])h--;
[color=#0000FF]else if[/color](s>[color=#800080]0 [/color]&& k[color=#800000][[/color]h[color=#800000]][[/color]s-[color=#800080]1[/color][color=#800000]][/color]==[color=#800080]0[/color])s--;
[color=#0000FF]else break[/color];
[color=#800000]}
[/color][color=#0000FF]for[/color](s=[color=#800080]0[/color];s<j;s++)[color=#800000]{
[/color][color=#0000FF]for[/color](h=[color=#800080]0[/color];h<i;h++)[color=#800000]{
[/color][color=#FF0000]printf[/color]([color=#FF00FF]"%4d"[/color],k[color=#800000][[/color]h[color=#800000]][[/color]s[color=#800000]][/color]);
[color=#800000]}
[/color][color=#FF0000]printf[/color]([color=#FF00FF]"\n"[/color]);
[color=#800000]}
[/color][color=#FF0000]printf[/color]([color=#FF00FF]"\n"[/color]);
[color=#800000]}
[/color][color=#0000FF]return [/color][color=#800080]0[/color];
[color=#800000]}
[/color][color=#FF0000]#include [/color][color=#FF00FF]"stdio.h"
[/color][color=#0000FF]int [/color][color=#FF0000]main[/color]()
[color=#800000]{
[/color][color=#0000FF]int [/color]i,j,t;
[color=#0000FF]while[/color]([color=#FF0000]scanf[/color]([color=#FF00FF]"%d%d%d"[/color],&j,&i,&t)!=[color=#800080]EOF[/color])[color=#800000]{
[/color][color=#0000FF]int [/color]n=[color=#800080]1[/color],h=[color=#800080]0[/color],s=[color=#800080]0[/color], k[color=#800000][[/color][color=#800080]31[/color][color=#800000]][[/color][color=#800080]31[/color][color=#800000]][/color]=[color=#800000]{{}[/color],[color=#800000]{}}[/color];
i--;j--;
[color=#0000FF]while[/color](t)[color=#800000]{
[/color]k[color=#800000][[/color]s[color=#800000]][[/color]h[color=#800000]][/color]=n++;
[color=#0000FF]if[/color]((h>=s || k[color=#800000][[/color]s-[color=#800080]1[/color][color=#800000]][[/color]h[color=#800000]][/color]!=[color=#800080]0[/color]) && h<j && k[color=#800000][[/color]s[color=#800000]][[/color]h+[color=#800080]1[/color][color=#800000]][/color]==[color=#800080]0 [/color])h++;
[color=#0000FF]else if[/color]( s<i && k[color=#800000][[/color]s+[color=#800080]1[/color][color=#800000]][[/color]h[color=#800000]][/color]==[color=#800080]0[/color])s++;
[color=#0000FF]else if[/color]( h>[color=#800080]0 [/color]&& k[color=#800000][[/color]s[color=#800000]][[/color]h-[color=#800080]1[/color][color=#800000]][/color]==[color=#800080]0[/color])h--;
[color=#0000FF]else if[/color]( s>[color=#800080]0 [/color]&& k[color=#800000][[/color]s-[color=#800080]1[/color][color=#800000]][[/color]h[color=#800000]][/color]==[color=#800080]0[/color])s--;
[color=#0000FF]else break[/color];
[color=#800000]}
[/color][color=#0000FF]while[/color](!t)[color=#800000]{
[/color]k[color=#800000][[/color]s[color=#800000]][[/color]h[color=#800000]][/color]=n++;
[color=#0000FF]if[/color]((s>=h || k[color=#800000][[/color]s[color=#800000]][[/color]h-[color=#800080]1[/color][color=#800000]][/color]!=[color=#800080]0[/color]) && s<i && k[color=#800000][[/color]s+[color=#800080]1[/color][color=#800000]][[/color]h[color=#800000]][/color]==[color=#800080]0 [/color])s++;
[color=#0000FF]else if[/color]( h<j && k[color=#800000][[/color]s[color=#800000]][[/color]h+[color=#800080]1[/color][color=#800000]][/color]==[color=#800080]0[/color])h++;
[color=#0000FF]else if[/color]( s>[color=#800080]0 [/color]&& k[color=#800000][[/color]s-[color=#800080]1[/color][color=#800000]][[/color]h[color=#800000]][/color]==[color=#800080]0[/color])s--;
[color=#0000FF]else if[/color]( h>[color=#800080]0 [/color]&& k[color=#800000][[/color]s[color=#800000]][[/color]h-[color=#800080]1[/color][color=#800000]][/color]==[color=#800080]0[/color])h--;
[color=#0000FF]else break[/color];
[color=#800000]}
[/color][color=#0000FF]for[/color](s=[color=#800080]0[/color];s<=i;s++)[color=#800000]{
[/color][color=#0000FF]for[/color](h=[color=#800080]0[/color];h<=j;h++)[color=#800000]{
[/color][color=#FF0000]printf[/color]([color=#FF00FF]"%4d"[/color],k[color=#800000][[/color]s[color=#800000]][[/color]h[color=#800000]][/color]);
[color=#800000]}
[/color][color=#FF0000]printf[/color]([color=#FF00FF]"\n"[/color]);
[color=#800000]}
[/color][color=#FF0000]printf[/color]([color=#FF00FF]"\n"[/color]);
[color=#800000]}
[/color][color=#0000FF]return [/color][color=#800080]0[/color];
[color=#800000]}[/color][/size][/font][/quote]
[tk43] [tk43] 谢谢楼主. 顶一个~~~~
发现还是新版本的好啊…… 解压密码~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
