
#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: Stringconst 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)
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)