怎么用c语言编一个词法分析器

Python020

怎么用c语言编一个词法分析器,第1张

简而言之就是先画一个状态图,然后根据图来编码就行

一个简单的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

<haha>hoho</haha></root>")

xml_Token

token

xml_initToken(&token,

&xml)

ret

=

xml_getToken(&xml,

&token)

printf("ret=%dtext=",ret)

xml_print(&token.text)

printf("type=%d\n\n",

token.type)

ret

=

xml_getToken(&xml,

&token)

printf("ret=%dtext=",ret)

xml_print(&token.text)

printf("type=%d\n\n",

token.type)

ret

=

xml_getToken(&xml,

&token)

printf("ret=%dtext=",ret)

xml_print(&token.text)

printf("type=%d\n\n",

token.type)

ret

=

xml_getToken(&xml,

&token)

printf("ret=%dtext=",ret)

xml_print(&token.text)

printf("type=%d\n\n",

token.type)

ret

=

xml_getToken(&xml,

&token)

printf("ret=%dtext=",ret)

xml_print(&token.text)

printf("type=%d\n\n",

token.type)

ret

=

xml_getToken(&xml,

&token)

printf("ret=%dtext=",ret)

xml_print(&token.text)

printf("type=%d\n\n",

token.type)

ret

=

xml_getToken(&xml,

&token)

printf("ret=%dtext=",ret)

xml_print(&token.text)

printf("type=%d\n\n",

token.type)

return

0

}

热门频道

首页

博客

研修院

VIP

APP

问答

下载

社区

推荐频道

活动

招聘

专题

打开CSDN APP

Copyright © 1999-2020, CSDN.NET, All Rights Reserved

打开APP

c语言lr文法还是ll文法,编译原理复习题 转载

2021-05-20 05:05:24

Tim Pan

码龄4年

关注

一、单项选择题 概述部分

1.构造编译程序应掌握 。D A. 源程序 B. 目标语言 C. 编译方法 D. 以上三项都是 2.编译程序绝大多数时间花在 上。D

A. 出错处理

B. 词法分析

C. 目标代码生成

D. 表格管理 3.编译程序是对 。D

A. 汇编程序的翻译

B. 高级语言程序的解释执行

C. 机器语言的执行

D. 高级语言的翻译 4. 将编译程序分成若干“遍”,是为了 。B

A. 提高程序的执行效率

B. 使程序的结构更为清晰 C 利用有限的机器内存并提高机器的执行效率 D. 利用有限的机器内存但降低了机器的执行效率

词法分析部分

1.DFA M(见图1-1)接受的字集为 。D A. 以0开头的二进制数组成的集合

B. 以0结尾的二进制数组成的集合

6cdcbebbe8f9854cde4e92f9afe9313b.png

C. 含奇数个0的二进制数组成的集合

D. 含偶数个0的二进制数组成的集合

2.词法分析器的输出结果是 。C

A. 单词的种别编码

B. 单词在符号表中的位置

C. 单词的种别编码和自身值

D. 单词自身值 3.正规式M1和M2等价是指 。C A. M1和M2的状态数相等 B. M1和M2的有向边条数相等 C. M1和M2所识别的语言集相等 D. M1和M2状态数和有向边条数相等 4.词法分析器的加工对象是 。 C A .中间代码 B .单词 C .源程序 D .元程序 5.同正规式(a|b )*等价的正规式为 。D A .(a|b)+ B .a*|b* C .(ab)* D .(a*|b*)+ 6. 两个DFA 等价是指: 。 D A. 这两个DFA 的状态数相同

B. 这两个DFA 的状态数和有向弧条数都相等

C. 这两个DFA 的有向弧条数相等

D. 这两个DFA 接受的语言相同

7. 下列符号串不可以由符号集S ={a,b}上的正闭包运算产生的是:(A ) A. ε B. a C. aa D. ab 8.称有限自动机A1和A2等价是指________。D A .A1和A2都是定义在一个字母表上的有限自动机 B .A1和A2状态数和有向边数相等

图1-1

1

相关资源:编译原理赋值语句的翻译LL文法LR文法简单优先法-专业指导文档类...

文章知识点与官方知识档案匹配

C技能树首页概览

110422 人正在系统学习中

打开CSDN APP,看更多技术内容

编译原理五 LR(1)分析法【C语言实现】_wangkay88的博客

1、使用 LR 的优点: (1)LR 分析器能够构造来识别所有能用上下文无关文法写的程序设计语言的结构。 (2)LR 分析方法是已知的最一般的无回溯移进-归约方法,它能够和其他移进-归约方法 一样有效地实现。 (3)LR 方法能分析的文法...

lr参数与C语言函数参数的区别_weixin_30254435的博客

LR参数是lr自己封装的一个钟对象, LR参数的表达方式:{ParamName}

编译原理习题——第2章 文法和语言试卷

第2章 文法和语言试卷 1. 文法:G:S→xSx|y所识别的语言是(D)。 A. xyx B. (xyx)* C.x*yx* D. xnyxn(n≥0) 2. 给定文法A→bA|ca,为该文法句子的是(C)。 A. bba B. cab C. bca D. cba 3. 文法G产生的(D)的全体是该文法描述的语言。 A. 句型 B. 终结符集 C. 非终结符集 D. 句子 4. 若文法G...

继续访问

编译原理习题(含答案)——2程序设计语言及其文法——哈工大陈鄞配套版本

程序设计语言及其文法1 文法:G:S→xSx | y所识别的语言是( )。 2 给定文法A→bA|ca,为该文法句子的是( )。A. bbaB. cabC. bcaD. Cba 3 设有文法G[S]:S->S1|S0|Sa|Sc|a|b|c,下列符号串中是该文法的句子有( )。A. ab0B. a0b01C. a0b0aD. bc10 4 文法G产生的( )的全体是该文法描述的语言。A. ...

继续访问

c语言lr分析器的设计与实现_[源码和文档分享]基于LR分析法的简单分析法...

通过设计、编制、调试一个简单计算器程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。 二、课程设计内容及步骤 本次课程设计需要使用 LR 分析法完成简单计算器的设计,其中算术表达式的文法如下: ...

C语言实现编译原理的LR分析法,编译原理LR(0)分析器(C语言).pdf

1LR 分析法 LR LR “ 分析法是一种自底向上进行的规范规约的语法分析方法, 指 自左向 右扫描和自底向上进行归约”。LR 分析法的一个主要缺点是,若用手工构造分析 LR 器则工作量相当大,因此必须求助于自动产生 分析器的产生器。

编译原理 第三章 词法分析

1、词法分析器的输出结果是单词的种类编码和自身值 2、词法分析器不能发现括号不匹配 3、不存在语言能被确定的有穷自动机识别但不能用正则表达式表示 4、两个有穷自动机等价实质它们的所识别的语言相等 5、词法分析器用于识别单词 6、正则表达式R1和R2等价是指R1和R2代表同一正则集 7、已知文法G[S]:S->A1, A->A1|S0|0,与G等价的正规式是0(1|10)^1 8、与(a...

继续访问

【编译原理-练习题-1】概述部分与词法分析部分选择,填空,判断,多选题

一、单项选择题 1.构造编译程序应掌握 (D ) 。 a. 源程序 b. 目标语言 c. 编译方法 d. 以上三项都是 2.编译程序绝大多数时间花在 (D) 上。 a. 出错处理 b. 词法分析 c. 目标代码生成 d. 表格管理 3.DFA M(见图1-1)接受的字集为(D ) 。 a. 以0开头的二进制数组成的集合 b. 以0结尾的二进制数组成的集合 ...

继续访问

LR中用C语言比较两个字符串变量_花露丝雨的博客

6.lr_save_string( "We can see the string:nancy","string1" )7.lr_save_string( "We can see the string:nancy","string2" )8.lr_output_message("the string1 is %s.",lr_eval_string("{string1}"))...

c语言字符串变量的比较,LR中用C语言比较两个字符串变量.doc_梦符佳月...

LR中用C语言比较两个字符串变量 Zee的早期文档.一:以下脚本,定义两个一样的字符数组,对比后,打印出result的值: vuser_init() { int result? ???char string1[] = "We can see the string:zee"...

最新发布 编译原理刷题(个人向)

编译原理刷题

继续访问

【编译原理】课后习题

1.构造编译程序应掌握:源程序、目标语言、编译方法 2.编译程序绝大多数时间花在表格管理上 3. 4.一个程序是正确的,包括两层含义:一是书写正确;二是含义正确 (合乎语法规则、合乎语义规则) 5.描述高级语言语法常用的方法有语法树、BNF范式、扩充的BNF范式等 6.程序语言一般可以分为低级语言和高级语言两大类,其中低级语言通常又称为面向机器的语言。面向机器语言指的是特定计算机系统所...

继续访问

C语言实现编译原理的LR分析法,实验三编译原理综合实验报告——(LR...

注意:本例是利用LR(0)分析来实现的语法分析,同学在写实验报告的时候,在结果分析这一块可以选用课堂讲过的LR(0)文法来说明验证结果即可。 同时附上你所选用的文法对应的LR(0)分析表。

编译原理总结,看这一篇就够了!_LeeDuo.的博客_编译原理

1.词法分析:对源程序的字符串进行扫描和分解,识别出每个单词符号。 2.语法分析:根据语言的语法规则,把单词符号分解成各类语法单位。 3.语义分析与中间代码生成:对各种语法范畴进行静态语义检查,若正确则进行中间代码翻译。 4.代码优化:...

C语言LR(1)文法

用C语言编写,对一个LR(1)文法分析,文法为:实现两个数的加减乘除四则运算。并能得出计算结果。

热门推荐 编译原理习题(含答案)——3词法分析——哈工大陈鄞配套版本

词法分析1 词法分析器的输出结果是( )。A. 单词自身值B. 单词在符号表中的位置C. 单词的种别编码 D. 单词的种别编码和自身值2 词法分析器不能( )。A. 识别出数值常量B. 过滤源程序中的注释C. 扫描源程序并识别记号D. 发现括号不匹配 3 ( )这样一些语言,它们能被确定的有穷自动机识别,但不能用正则表达式表示。A. 存在B. 不存在C. 无法判定是否存在D. 以上答案都不对 4 ...

继续访问

C--编译器:C--编译器,实现LL(1)\ LR(0)\ SLR \ LR(1)并生成语义分析和MIPS

实现了自制的C--语言的一遍扫描编译,包括词法分析,LR(1)语法分析,属性文法+中间代码生成,MIPS编译生成编译脚本由Python实现,兼容python2.7与3.7,图形界面由WPF实现,使用了IronPython进行脚本执行 支持以下特性: 一种基本类型int 赋值表达式,循环/选择/判断/跳出语句 函数定义与函数调用 未实现: 浮点数,字符,字符串 斑点 错误检查

编译原理之LR(0)分析算法的c实现

LR(0)分析器的构造算法如下: 对一个文法构造了它的LR(0)分析表后就可以在LR分析器的总控程序(驱动程序)控制下对输入串进行分析,即根据输入串的当前符号和分析栈的栈顶状态查找分析表应采取的动作,对状态栈和符号栈进行相应的操作即移进、归约、接受或报错。具体说明如下: (1)若ACTION[S,a]=Sj,a为终结符,则把a移入符号栈,j移入状态栈; (2)若ACTION[S,a]=rj,

继续访问

编译原理第一章自测题

第一章 高级语言与编译程序概述 一、单项选择题 1.将编译程序分成若干个“遍”是为了____ 。 A. 提高程序的执行效率 B. 使程序的结构更加清晰 C. 利用有限的机器内存并提高机器的执行效率 D. 利用有限的机器内存但降低了机器的执行效率 2.构造编译程序应掌握 ____ 。 A. 源程序 B. 目标语言 C. 编译方法 D. 以上三项都是 3.编译程序绝大多数时间花在 ____ 上。 A. 出错处理 B. 词法分析 C. 目标代码生成 D. 管理表格

C语言语法分析程序(编译原理:LR)

北邮大三编译原理课程序 注释很详细

用c++实现LR语法分析器

通过LR分析表及三个栈形成对输入表达式的判断! 。

c语言lr文法还是ll文法,编译原理第五章语法分析课后题

(先补到这里,后面如果有需要的话,垃圾博主还会回来继续更的。。。)5.1 递归子程序法属于()语法分析方法A. 自顶向下B. 自底向上C. 自左向右D. 自右向左5.2 采用确定的自顶向下分析时,必须()A. 消除左递归B. 消除右递归C. 避免回溯D. 提取左公因子5.3 自上而下语法分析的主要分析动作是A. 推导B. 移进C. 归约D. 匹配5.4 一个字符属于FOLLOW(S),这个字符的含...

继续访问

编译原理,C语言实现LR(0)分析(扩展文法的生成、项目集规范簇的生成、ACTION GOTO表的生成、句子的分析)

编译原理,C语言实现LR(0)分析(扩展文法的生成、项目集规范簇的生成、ACTION GOTO表的生成、句子的分析) (1)根据提示输入文法的个数 (2)输入文法 (3)扩展文法的生成、项目集规范簇的生成、ACTION GOTO表的生成 (3)分析句子 (4)生成分析过程 C语言实现LR(0)分析源代码

继续访问

编译程序基本原理

编译程序和解释程序 人们利用高级语言与计算机进行交互, 但计算机仍然只能理解和执行由 0, 1序列构成的机器语言, 因此高级程序设计语言需要翻译, 担负这一任务的程序称为"语言处理程序", 由于应用的不同, 语言之间的翻译也是多种多样的. 大致可分为 汇编程序、解释程序和编译程序. 用某种高级语言或汇编语言编写的程序称为 源程序, 源程序不能直接在计算机上执行. 如果源程序是用汇编语言写的, ...

继续访问

LR脚本用户自定义C语言函数

LR脚本实战:用户自定义C语言函数 Loadrunner可以使用标准C语言的函数,因此我们可以在脚本中编写自己的函数用于调用,把脚本结构化,更好的进行重用。 先看一个例子: Action() { int i,jj = 1for (i=0i<10i++) { lr_message("i+j=%d",sum(i,j))j++} ...

继续访问

编译原理,第一章绪论

编译过程和编译程序结构 五个阶段: 词法分析 语法分析 语义分析和中间代码生成 优化 目标代码生成 编译程序的开发 自编译:用某种高级语言编写自己的编译程序称为自编译, 交叉编译:用A机器上的编译程序来产生可在B机器上运行的目标代码 自展:首先确定一个非常简单的核心语言L0,然后用机器语言或者汇编语言写出它的编译程序T0,再把语言L0扩充到L1,用L0编写L1的编译程序T1,这样不断扩展下去...

继续访问

c语言是 ll文法和lr文法哪个好

c语言lr文法还是ll文法

写评论

评论

收藏

点赞

分享

我有,这是这学期刚做的,

#include <iostream>

#include <fstream>

#include <sstream>

#include <string>

#include <vector>

#include <algorithm>

using namespace std

bool isLetter(char ch){

if ((ch>='A' &&ch<='Z') || (ch>='a' &&ch<='z')) return true

else return false

}

bool isDigit(char ch){

if (ch>='0' &&ch<='9') return true

else return false

}

bool isP(char ch){

if(ch=='+'||ch=='*'||ch=='-'||ch=='/') return true

//ch==':'||ch==','||ch=='='||ch==''||ch=='('||ch==')'

else return false

}

bool isJ(char ch){

if(ch==','||ch==''||ch=='.'||ch=='('||ch==')'||ch=='['||ch==']'||ch=='='||ch==':'||ch=='<'||ch=='>'||ch=='{'||ch=='}'||ch=='#') return true

//

else return false

}

bool isBlank(char ch){

if(ch==' '||ch=='\t') return true

else return false

}

int main(){

string src,ste,s

char ch0,ch,ch1[2]

char ktt[48][20]={"and","begin","const","div","do","else","end","function","if","integer",

"not","or","procedure","program","read","real","then","type","var","while","write","标识符","无符号数",

",","",":",".","(",")","[","]","..","++","--","+","-","*","/","=","<",">","<>","<="

,">=",":=","{","}","#"}

int pos=0

FILE *fp

fp=fopen("d:\\in.txt","r")

ch0=fgetc(fp)

while(ch0!=EOF)

{

//if(ch0!='\t'){src+=ch0}

src+=ch0

ch0=fgetc(fp)

}

src+='#'

cout<<src<<endl

ch=src[pos++]

ste=" "

for(int j=0j<47j++){cout<<j<<ktt[j]<<endl}

cout<<"词法分析:\n"

while(ch!='#')

{

char str[20]

if(ch!='\n')

{

if(isDigit(ch))

{ //判断常数

int i=0

while(isDigit(ch)||ch=='.')

{

str[i++]=ch

//i++

ch=src[pos++]

}

str[i]='\0'

ste=ste+"|"+"22"

cout<<str

continue

}

else if(isLetter(ch))

{ //判断字符

int i=0,j

while(isLetter(ch)||isDigit(ch))

{

str[i++]=ch

//i++

ch=src[pos++]

}

str[i]='\0'

for(j=0j<21j++){ //判断是否关键字

int t=strcmp(str,ktt[j])

if(t==0) {

stringstream ss

ste+="|"

ss<<stess<<j

ss>>ste

break

}

}

if(j==21){ste=ste+"|"+"21"}

// cout<<" "

cout<<str

continue

}

else if(isP(ch)){ ///判断是否运算符

int i=0,j

str[i++]=ch

str[i]='\0'

for(j=34j<38j++){

int t=strcmp(str,ktt[j])

if(t==0) {

stringstream ss

ste+="|"

ss<<stess<<j

ss>>ste

break

}

}

cout<<str

ch=src[pos++]

continue

}

else if(isJ(ch)) //判断是否界符

{

int i=0,j

while(isJ(ch))

{

str[i++]=ch

ch=src[pos++]

}

str[i]='\0'

for(j=23j<47j++){

int t=strcmp(str,ktt[j])

if(t==0) {

stringstream ss

ste+="|"

ss<<stess<<j

ss>>ste

break

}

}

cout<<str

continue

}

else if(isBlank(ch))

{

cout<<ch

ch=src[pos++]

continue

}

}

else{

cout<<ste<<endl

ste=" "

}

ch=src[pos++]

}

return 0

}

还有运行效果图,和实验报告 ,你要的话留下邮箱