一个C语言词法分析题目

一个C语言词法分析题目,第1张

//给你课程设计的词法部分呵呵

#include <iostream>

#include <fstream>

#include <stack>

#include <map>

#include <string>

using namespace std

#define zhengshu 1//int

#define IF 2 //if

#define ELSE 3 //else

#define shishu 4 //float

#define PRINT 5 //print

#define ID 6//identify

#define CONSTANT 7 //constant

#define op_fuzhi 8//=

#define op_add 9//+

#define op_mul 10 //*

#define op_2star 11 //**

#define div_fenhao 12 //

#define syl_ls 13 //(

#define syl_rs 14 //)

#define syl_lb 15 //{

#define syl_rb 16 //}

#define sbl_lm 17 //[

#define sbl_rm 18 //]

#define op_sub 19 //-

#define op_div 20 // /

#define div_douhao 21 //,

#define rop_yu 22 //&&

#define op_or 23 //||

#define rop_fei 24 //!

#define rop_equal 25 //==

#define rop_dayu 26 //>

#define rop_xiaoyu 27 //<

#define rop_buxiaoyu 28 //>=

#define rop_budayu 29 //<=

#define rop_uneql 30 //!=

#define TEMP 31

#define NULL 0

#define JMP 32

#define GOTO 33 //goto标识

/*****************************重要数据结构的声明开始*************************/

struct delos

{

int code,value

}*result //结果

//变量表

struct analyse

{

int state

char sign

}

struct list

{

int value

list *next

}

//条件语句的LR(1)分析表,110表示接受,999表示出错

int table[38][20]={

/*0*/{3,999,999,999,999,999,999,999,999,999,999,999,4,999,1,2,999,999,999,999},

/*1*/{999,999,999,999,999,999,999,999,999,999,999,999,999,110,999,999,999,999,999,999},

/*2*/{74,999,999,999,999,999,999,999,999,999,999,999,74,74,999,999,999,999,5,999},

/*3*/{999,6,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999},

/*4*/{999,999,999,999,7,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999},

/*5*/{999,999,999,999,999,999,999,999,999,999,999,999,999,61,999,999,999,999,999,999},

/*6*/{999,12,999,999,999,999,999,9,999,999,999,11,13,999,999,999,8,10,999,999},

/*7*/{999,12,999,999,999,999,999,999,999,999,999,11,13,999,999,999,999,14,999,999},

/*8*/{999,999,15,999,999,16,17,999,999,999,999,999,999,999,999,999,999,999,999,999},

/*9*/{999,12,999,999,999,999,999,9,999,999,999,11,13,999,999,999,18,10,999,999},

/*10*/{999,999,999,999,999,999,999,999,19,20,21,999,999,999,999,999,999,999,999,999},

/*11*/{999,12,999,999,999,999,999,999,999,999,999,11,13,999,999,999,999,22,999,999},

/*12*/{999,12,999,999,999,999,999,999,999,999,999,11,13,999,999,999,999,23,999,999},

/*13*/{999,999,73,73,999,73,73,999,73,73,73,999,999,73,999,999,999,999,999,999},

/*14*/{999,999,999,64,999,999,999,999,999,20,21,999,999,64,999,999,999,999,999,999},

/*15*/{74,999,999,999,999,999,999,999,999,999,999,999,74,74,999,999,999,999,24,999},

/*16*/{74,999,999,999,999,999,999,999,999,999,999,999,74,74,999,999,999,999,999,25},

/*17*/{74,999,999,999,999,999,999,999,999,999,999,999,74,74,999,999,999,999,999,26},

/*18*/{999,999,67,999,999,67,67,999,999,999,999,999,999,999,999,999,999,999,999,999},

/*19*/{999,12,999,999,999,999,999,999,999,999,999,11,13,999,999,999,999,27,999,999},

/*20*/{999,12,999,999,999,999,999,999,999,999,999,11,13,999,999,999,999,28,999,999},

/*21*/{999,12,999,999,999,999,999,999,999,999,999,11,13,999,999,999,999,29,999,999},

/*22*/{999,999,71,71,999,71,71,999,71,71,71,999,999,71,999,999,999,999,999,999},

/*23*/{999,999,30,999,999,999,999,999,999,20,21,999,999,999,999,999,999,999,999,999},

/*24*/{3,999,999,999,999,999,999,999,999,999,999,999,4,999,999,31,999,999,999,999},

/*25*/{999,12,999,999,999,999,999,9,999,999,999,11,13,999,999,999,32,10,999,999},

/*26*/{999,12,999,999,999,999,999,9,999,999,999,11,13,999,999,999,33,10,999,999},

/*27*/{999,999,68,999,999,68,68,999,999,20,21,999,999,999,999,999,999,999,999,999},

/*28*/{999,999,69,69,999,69,69,999,69,69,21,999,999,69,999,999,999,999,999,999},

/*29*/{999,999,70,70,999,70,70,999,70,70,70,999,999,70,999,999,999,999,999,999},

/*30*/{999,999,72,72,999,72,72,999,72,72,72,999,999,72,999,999,999,999,999,999},

/*31*/{999,999,999,75,999,999,999,999,999,999,999,999,999,63,999,999,999,999,999,34},

/*32*/{999,999,65,999,999,65,65,999,999,999,999,999,999,999,999,999,999,999,999,999},

/*33*/{999,999,66,999,999,16,66,999,999,999,999,999,999,999,999,999,999,999,999,999},

/*34*/{999,999,999,35,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999},

/*35*/{74,999,999,999,999,999,999,999,999,999,999,999,74,74,999,999,999,999,36,999},

/*36*/{3,999,999,999,999,999,999,999,999,999,999,999,4,999,999,37,999,999,999,999},

/*37*/{999,999,999,62,999,999,999,999,999,999,999,999,999,62,999,999,999,999,999,999}

}

/*****************************重要数据结构的声明结束*************************/

/*********************************全局变量声明开始**************************/

int place=1

int nextpos=1

stack<list *>stknext

stack<list *>stktrue

stack<list *>stkfalse

stack<int>stkpos

stack<delos>stktemp//常量,变量,临时变量

delos temp

delos gen[50][4]//生成的三地址

string str[31]={"","int","if","else","float","print","标识符","常数",

"=","+","*","**","","(",")",

"{","}","[","]","-","/",",","&&","||","!",

"==",">","<",">=","<=","!="}

//变量

string *var

int varlen=0,nowvar=1

//常量

float *myconst

int constlen=0,nowconst=1

int resultlen=0,nowresult=0

/*********************************全局变量声明结束**************************/

void renewresult()

{

delos *p3=result

int i

resultlen+=10

result=new delos[resultlen]

for(i=0i<resultleni++)

{ result[i].code=p3[i].code

result[i].value=p3[i].value

}

delete[] p3

}

void renewvar()

{

string *p1=var

int i

varlen+=10

var=new string[varlen]

for(i=0i<nowvari++)

var[i]=p1[i]

delete[] p1

}

void renewconst()

{

float *p2=myconst

int i

constlen+=10

myconst=new float[constlen]

for(i=0i<nowconsti++)

myconst[i]=p2[i]

delete[] p2

}

bool isletter(char c) //判别是否字母

{

if(c>64&&c<91||c>96&&c<123)

return true

return false

}

bool isdigital(char c) //判别是否数字

{ if(c>47&&c<58)

return true

return false

}

int reserve(char c[],int i)

{

string s(c,0,i)

for(int j=1j<7j++)

if(s==str[j])

return j

return 0

}

void insertresult(int code,int value)

{ if(nowresult>resultlen)

renewresult()

result[nowresult].code=code

result[nowresult++].value=value

}

void insertid(char c[],int i)

{ string s(c,0,i)

insertresult(ID,nowvar)

if(nowvar>varlen)

renewvar()

var[nowvar++]=s

}

//插入常数,为浮点型

void insertconst(char c[],int i)

{ int d=0,j

float a=0,b=1

while(c[d]!='.'&&d<i)

d++

for(j=d-1j>=0j--)

{ a=a+(c[j]-48)*b

b=b*10

}

b=10

for(j=d+1j<ij++)

{a=a+(c[j]-48)/b

b=b*10

}

insertresult(CONSTANT,nowconst)

if(nowconst>constlen)

renewconst()

myconst[nowconst++]=a

}

/**********************************词法分析函数开始***********************/

void wordanalyse()

{

char strtoken[10]

int i=0,code

char ch

ifstream myfile

myfile.open("sourcefile.txt")

if(!myfile)

{ cout<<"Can not open input file !"<<endl

return

}

while(!myfile.eof())

{ i=0

for(ch=myfile.get()ch==' '||ch==13||ch==10ch=myfile.get())

if(isletter(ch))

{while(isletter(ch)||isdigital(ch))

{strtoken[i++]=ch

ch=myfile.get()

}

myfile.seekg(-1,ios::cur)

code=reserve(strtoken,i)

if(code==0)

insertid(strtoken,i)

else

{insertresult(code,0)

}

}

else if(isdigital(ch))

{while(isdigital(ch)||ch=='.')

{strtoken[i++]=ch

ch=myfile.get()

}

myfile.seekg(-1,ios::cur)

insertconst(strtoken,i)

}

else if(ch=='=')

{ ch=myfile.get()

if(ch=='=')

insertresult(rop_equal,0)

else

{insertresult(op_fuzhi,0)

myfile.seekg(-1,ios::cur)

}

}

else if(ch=='+')

{insertresult(op_add,0)

}

else if(ch=='*')

{ ch=myfile.get()

if(ch=='*')

insertresult(op_2star,0)

else

{insertresult(op_mul,0)

myfile.seekg(-1,ios::cur)

}

}

else if(ch=='')

{ insertresult(div_fenhao,0)

}

else if(ch=='(')

{insertresult(syl_ls,0)

}

else if(ch==')')

{insertresult(syl_rs,0)

}

else if(ch=='{')

{ insertresult(syl_lb,0)

}

else if(ch=='}')

{ insertresult(syl_rb,0)

}

else if(ch=='[')

{ insertresult(sbl_lm,0)

}

else if(ch==']')

{ insertresult(sbl_rm,0)

}

else if(ch=='-')

{ insertresult(op_sub,0)

}

else if(ch=='/')

{ insertresult(op_div,0)

}

else if(ch==',')

{ insertresult(div_douhao,0)

}

else if(ch=='&')

{ ch=myfile.get()

if(ch=='&')

insertresult(rop_yu,0)

else

{

myfile.seekg(-1,ios::cur)

myfile.get(strtoken,10)

cout<<"ERROR :"<<strtoken<<endl

}

}

else if(ch=='|')

{ ch=myfile.get()

if(ch=='|')

insertresult(op_or,0)

else

{

myfile.seekg(-1,ios::cur)

myfile.get(strtoken,10)

cout<<"ERROR :"<<strtoken<<endl

}

}

else if(ch=='!')

{ ch=myfile.get()

if(ch=='=')

insertresult(rop_uneql,0)

else

{insertresult(rop_fei,0)

myfile.seekg(-1,ios::cur)

}

}

else if(ch=='>')

{ ch=myfile.get()

if(ch=='=')

insertresult(rop_buxiaoyu,0)

else

{insertresult(rop_dayu,0)

myfile.seekg(-1,ios::cur)

}

}

else if(ch=='<')

{ ch=myfile.get()

if(ch=='=')

insertresult(rop_budayu,0)

else

{insertresult(rop_xiaoyu,0)

myfile.seekg(-1,ios::cur)

}

}

else

{if(ch!=-1)

{myfile.seekg(-1,ios::cur)

myfile.get(strtoken,10)

cout<<"ERROR :"<<strtoken<<endl

myfile.seekg(1,ios::cur)

}

}

}

myfile.close()

cout<<"词法分析成功啦!!"<<endl

}

/**********************************词法分析函数结束***********************/

你好,基础库 /低版本兼容

兼容

小程序的功能不断的增加,但是旧版本的微信客户端并不支持新功能,所以在使用这些新能力的时候需要做兼容。

开发者可以通过以下方式进行低版本的兼容:

1. 版本号比较

微信客户端和小程序基础库的版本号风格为 Major.Minor.Patch(主版本号 . 次版本号 . 修订版本号)。

文档中会在组件,API等页面描述中带上各个功能所要求的最低基础库版本号。

开发者可以在小程序中通过调用 wx.getAppBaseInfo 获取到当前小程序运行的基础库的版本号。通过版本号比较的方式进行运行低版本兼容逻辑。

版本号比较适用于所有情况。部分场景下也可以使用后面提到的方法完成。

<=2.20.1 的基础库请使用 wx.getSystemInfo]((wx.getSystemInfo)) 或者 wx.getSystemInfoSync 获取基础库版本

注意:不可以直接使用字符串比较的方法进行版本号比较。例如 '2.29.1' >'2.3.0' 是 false 的

版本号比较可以参考以下代码:

function compareVersion(v1, v2) {

v1 = v1.split('.')

v2 = v2.split('.')

const len = Math.max(v1.length, v2.length)

while (v1.length <len) {

v1.push('0')

}

while (v2.length <len) {

v2.push('0')

}

for (let i = 0i <leni++) {

const num1 = parseInt(v1[i])

const num2 = parseInt(v2[i])

if (num1 >num2) {

return 1

} else if (num1 <num2) {

return -1

}

}

return 0

}

compareVersion('1.11.0', '1.9.9') // 1

const version = wx.getAppBaseInfo().SDKVersion

if (compareVersion(version, '1.1.0') >= 0) {

wx.openBluetoothAdapter()

} else {

// 如果希望用户在最新版本的客户端上体验您的小程序,可以这样子提示

wx.showModal({

title: '提示',

content: '当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试。'

})

}

2. API 存在判断

对于新增的 API,可以通过判断该 API 是否存在来判断是否支持用户使用的基础库版本。例如:

if (wx.openBluetoothAdapter) {

wx.openBluetoothAdapter()

} else {

// 如果希望用户在最新版本的客户端上体验您的小程序,可以这样子提示

wx.showModal({

title: '提示',

content: '当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试。'

})

}

3. wx.canIUse

除了直接通过版本号判断,也可以通过 wx.canIUse 来判断是否可以在该基础库版本下直接使用。例如:

API 参数或返回值

对于 API 的参数或者返回值有新增的参数,可以判断用以下代码判断。

function foramtStr(const s: String

const len: integer): String

var

s1:String

iCount,

iInputLen:integer

begin

s1:=trim(s)

iInputLen:=length(s1)

if iInputLen>len then

begin

result:=Copy(s1,1,len)

exit

end

else

begin

for iCount:=1 to (len-iInputLen) do

s1:=s1+'0'

end

result:=s1

end

调用:

Edit1.text:= foramtStr(edit1.text,8)


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11248379.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-14
下一篇2023-05-14

发表评论

登录后才能评论

评论列表(0条)

    保存