本篇文章给大家谈谈c语言语法分析器,以及c语言实现语法分析器对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
1、怎么用c语言编一个词法分析器2、这里有一个c语言的语法分析程序,该怎么使用,我想得到它的语法树,然后在上面提取循环语句信息?3、c语言的词法分析器和语法分析器有什么区别?4、如何用flex+bison写语法分析器5、C语言的语法分析器
怎么用c语言编一个词法分析器
简而言之就是先画一个状态图,然后根据图来编码就行
一个简单的xml的词法分析器供参考
#include
stdio.h
#include
stdlib.h
#include
string.h
typedef
struct
{
char
*p;
int
len;
}
xml_Text;
typedef
enum
{
xml_tt_U,
/*
Unknow
*/
xml_tt_H,
/*
Head
?xxx?*/
xml_tt_E,
/*
End
/xxx
*/
xml_tt_B,
/*
Begin
xxx
*/
xml_tt_BE,
/*
Begin
End
xxx/
*/
xml_tt_T
/*
Text
xxx
*/
}
xml_TokenType;
typedef
struct
{
xml_Text
text;
xml_TokenType
type;
}
xml_Token;
int
xml_initText(xml_Text
*pText,
char
*s)
{
pText-p
=
s;
pText-len
=
strlen(s);
return
0;
}
int
xml_initToken(xml_Token
*pToken,
xml_Text
*pText)
{
pToken-text.p
=
pText-p;
pToken-text.len
=
0;
pToken-type
=
xml_tt_U;
return
0;
}
int
xml_print(xml_Text
*pText)
{
int
i;
for
(i
=
0;
i
pText-len;
i++)
{
putchar(pText-p[i]);
}
return
0;
}
int
xml_println(xml_Text
*pText)
{
xml_print(pText);
putchar(‘\n’);
return
0;
}
int
xml_getToken(xml_Text
*pText,
xml_Token
*pToken)
{
char
*start
=
pToken-text.p
+
pToken-text.len;
char
*p
=
start;
char
*end
=
pText-p
+
pText-len;
int
state
=
0;
pToken-text.p
=
p;
pToken-type
=
xml_tt_U;
for
(;
p
end;
p++)
{
switch(state)
{
case
0:
switch(*p)
{
case
”:
state
=
1;
break;
default:
state
=
7;
break;
}
break;
case
1:
switch(*p)
{
case
‘?’:
state
=
2;
break;
case
‘/’:
state
=
4;
break;
default:
state
=
5;
break;
}
break;
case
2:
switch(*p)
{
case
‘?’:
state
=
3;
break;
default:
state
=
2;
break;
}
break;
case
3:
switch(*p)
{
case
”:
pToken-text.len
=
p
–
start
+
1;
pToken-type
=
xml_tt_H;
return
1;
default:
state
=
-1;
break;
}
break;
case
4:
switch(*p)
{
case
”:
pToken-text.len
=
p
–
start
+
1;
pToken-type
=
xml_tt_E;
return
1;
default:
state
=
4;
break;
}
break;
case
5:
switch(*p)
{
case
”:
pToken-text.len
=
p
–
start
+
1;
pToken-type
=
xml_tt_B;
return
1;
case
‘/’:
state
=
6;
break;
default:
state
=
5;
break;
}
break;
case
6:
switch(*p)
{
case
”:
pToken-text.len
=
p
–
start
+
1;
pToken-type
=
xml_tt_BE;
return
1;
default:
state
=
-1;
break;
}
break;
case
7:
switch(*p)
{
case
”:
p–;
pToken-text.len
=
p
–
start
+
1;
pToken-type
=
xml_tt_T;
return
1;
default:
state
=
7;
break;
}
break;
default:
pToken-text.len
=
p
–
start
+
1;
pToken-type
=
xml_tt_T;
return
1;
}
}
return
0;
}
int
main()
{
int
ret
=
0;
xml_Text
xml;
xml_initText(xml,
“?xml?root
ss
hahahoho/haha/root”);
xml_Token
token;
xml_initToken(token,
xml);
ret
=
xml_getToken(xml,
token);
printf(“ret=%d;text=”,ret);
xml_print(token.text);
printf(“;type=%d;\n\n”,
token.type);
ret
=
xml_getToken(xml,
token);
printf(“ret=%d;text=”,ret);
xml_print(token.text);
printf(“;type=%d;\n\n”,
token.type);
ret
=
xml_getToken(xml,
token);
printf(“ret=%d;text=”,ret);
xml_print(token.text);
printf(“;type=%d;\n\n”,
token.type);
ret
=
xml_getToken(xml,
token);
printf(“ret=%d;text=”,ret);
xml_print(token.text);
printf(“;type=%d;\n\n”,
token.type);
ret
=
xml_getToken(xml,
token);
printf(“ret=%d;text=”,ret);
xml_print(token.text);
printf(“;type=%d;\n\n”,
token.type);
ret
=
xml_getToken(xml,
token);
printf(“ret=%d;text=”,ret);
xml_print(token.text);
printf(“;type=%d;\n\n”,
token.type);
ret
=
xml_getToken(xml,
token);
printf(“ret=%d;text=”,ret);
xml_print(token.text);
printf(“;type=%d;\n\n”,
token.type);
return
0;
}
这里有一个c语言的语法分析程序,该怎么使用,我想得到它的语法树,然后在上面提取循环语句信息?
在计算机科学中,抽象语法树(abstract syntax tree或者缩写为AST),或者语法树(syntax tree),是源代码的抽象语法结构的树状表现形式,这里特指编程语言的源代码。树上的每个节点都表示源代码中的一种结构。之所以说语法是“抽象”的,是因为这里的语法并不会表示出真实语法中出现的每个细节。比如,嵌套括号被隐含在树的结构中,并没有以节点的形式呈现;而类似于if-condition-then这样的条件跳转语句,可以使用带有两个分支的节点来表示。和抽象语法树相对的是具体语法树(concrete syntaxtree),通常称作分析树(parse tree)。一般的,在源代码的翻译和编译过程中,语法分析器创建出分析树。一旦AST被创建出来,在后续的处理过程中,比如语义分析阶段,会添加一些信息。
c语言的词法分析器和语法分析器有什么区别?
顾名思义,词法分析器检查的是词法,语法分析器分析的是语法,什么是词法,什么是语法你弄明白就知道了。
所谓词法,源代码由字符流组成,字符流中包括关键字,变量名,方法名,括号等等符号,其中变量名要满足不能包括标点符号,不能以数字开头的数字与字母的字符串这个条件,对于括号要成对出现等等,这就是词法;
而语法,词法没有问题才能进入语法分析,语法就是词排列的方法,字面意义,比如一句中文:我吃萝卜,里面有三个词我 吃 萝卜,除了“我吃萝卜”外,这三个词还可以组成,“萝卜吃我”“萝卜我吃”等,显然按照中文文法,后面的两句话是不对的,语法分析器就是分析类似这样的语法的。
如何用flex+bison写语法分析器
书籍请参考编译原理的龙书,以及flex,bison,llvm的manual。如何写我可以给你一个大致的流程,编译器由词法分析器-语法分析器-中间代码生成器-后端组成。用C语言写编译器一般可以按照以下步骤:1.使用flex生成词法分析器。(flex可以通过自己编写的描述文件来自动生成词法分析器)2.使用bison生成语法分析器。(bison可以通过自己编写的描述文件来自动生成语法分析器)3.通过语法分析器得到输入代码的语法树表示。4.编写遍历函数遍历语法树生成中间代码。(这里推荐使用LLVM的中间代码表示)5.利用LLVM工具集来编译执行所得到的中间代码。
C语言的语法分析器
先做个LL(1)或者LALR的语法分析器,然后先把教材上的几个LL(1)的例子调通过。然后网上有C语言子集的文法,有人做了转成大小写这样的表述。通过那个的测试就差不多了。。。。其实做语法分析也没多大用 编译器的难点在于语法制导、代码优化之类的,真要做C语言的完整编译器,普通的学生都几乎不可能实现。。。。就不多说了 你可以动手开始做了 如果你有较强的程序设计能力,做个漂亮的LR(1)分析器还是可以的,实在不会就做SLR(1)这样的分析器,如果程序设计能力比较差,建议先做LL(1),那个比较好做。码字不易,望采纳!
关于c语言语法分析器和c语言实现语法分析器的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。