首页 > 其他分享 >UVA12421 (Jiandan) Mua (I) - Lexical Analyzer题解

UVA12421 (Jiandan) Mua (I) - Lexical Analyzer题解

时间:2024-08-30 12:04:24浏览次数:12  
标签:__ return int 题解 Lexical Analyzer && define

没什么废话、超级珂爱的大模拟。

本蒟蒻写了 2h 才过。

其实就是按题意模拟即可,不需要什么高深的算法。

本人就是错在了符号中的 “=” ,因为如果是连续的两个等于号,只能输出 “==”,

而不能输出“=” “==”,然后本人就卡在这个地方卡了 1.5h 。

代码量也不大,主要是毒瘤细节模拟题。

code:

#include <bits/stdc++.h>
using namespace std;

#define For(i,x,y,...) for(int i=(x),##__VA_ARGS__;i<=(y);++i)
#define foR(i,x,y,...) for(int i=(x),##__VA_ARGS__;i>=(y);--i)
#define Rep(i,x,y,...) for(int i=(x),##__VA_ARGS__;i<(y);++i)
#define endl '\n'
#define debug(...)
#define debug1(a,i,...) cout<<i<<" "<<a[i]<<endl;
typedef long long ll;
#define fi first
#define se second
#define PII pair<int,int>
#define me(s,x) memset(s,x,sizeof s)
#define pb emplace_back

template<typename T=int>T read(){T x;cin>>x;return x;}
const int mod=1e9+7;
struct mint{
	ll x;mint(int x=0):x(x<0?x+mod:x<mod?x:x-mod){}
	mint(ll y){y%=mod,x=y<0?y+mod:y;}
	mint& operator += (const mint &y){x=x+y.x<mod?x+y.x:x+y.x-mod;return *this;}
	mint& operator -= (const mint &y){x=x<y.x?x-y.x+mod:x-y.x;return *this;}
	mint& operator *= (const mint &y){x=1ll*x*y.x%mod;return *this;}
	friend mint operator + (mint x,const mint &y){return x+y;}
	friend mint operator - (mint x,const mint &y){return x-y;}
	friend mint operator * (mint x,const mint &y){return x*y;}
};mint Pow(mint x,ll y=mod-2){mint z(1);for(;y;y>>=1,x*=x)if(y&1)z*=x;return z;}
string s;
string bl[]={"and","break","do","else","elseif","end","false","for","function","if","in","local","nil","not","or","repeat","return","then","true","until","while"};
char fh[]={'+','-','*','/','%','^','#','=','=','>','=','<','=','>','<','~','=','(',')','{','}','[',']',';',':',',','.','=',};
bool chknm(char c){
	return (c>='0'&&c<='9')||(c>='a'&&c<='z')||(c>='A'&&c<='Z')||c=='_';
}
bool chkfuhao(char c){
	for(auto x:fh){
		if(x==c) return 1;
	}
	return 0;
}
bool fl=0;
bool chknum(char c){
	if((c>='0'&&c<='9')||(c>='a'&&c<='f')||(c>='A'&&c<='F')) return 1;
	if(c=='.'&&!fl){
		fl=1;
		return 1;
	}
	return 0;
}
void MAIN(){
	int n=s.size();
	Rep(i,0,n){
		if(s[i]==' ')continue;
		if(s[i]=='-'&&s[i+1]=='-') break;//一整行都是注释
		if(s[i]>='0'&&s[i]<='9'||s[i]=='.'&&(s[i+1]>='0'&&s[i+1]<='9')){
			fl=0;
			printf("[NUMBER] ");
			string ans="";
			if(s[i]=='.') fl=1,ans+=s[i],i++;
			if(s[i]=='0'&&(s[i+1]=='x'||s[i+1]=='X'))ans+=s[i],ans+=s[i+1],i+=2,fl=1;
			while(chknum(s[i])){
				ans+=s[i];
				if(s[i]=='e'&&(s[i+1]=='-'||s[i+1]=='+')){
					i++;
					ans+=s[i];
				}
				i++;
			}
			i--;
			cout<<ans;
			puts("");
		}
		else if(s[i]=='"'){
			if(s[i-1]=='\\') continue;
			printf("[STRING] ");
			int k=i;
			for(;i<n;i++){
				putchar(s[i]);
				if(i!=k&&s[i]=='"'&&s[i-1]!='\\'){
					break;
				}
			}
			puts("");
		}
		else if(chkfuhao(s[i])){
			printf("[SYMBOL] ");
			if(s[i]=='.'){
				if(s[i+1]=='.'){
					if(s[i+2]=='.') i+=2,cout<<"...";
					else i++,cout<<"..";
				}
				else cout<<".";
			}
			else if(s[i]=='='){
				if(s[i+1]=='=') cout<<"==",i++;
				else if(s[i-1]=='~'||s[i-1]=='>'||s[i-1]=='<')cout<<s[i-1]<<"=",i++;
				else cout<<'=';
			}
			else putchar(s[i]);
			puts("");
		}
		else if(s[i]>='a'&&s[i]<='z'||s[i]>='A'&&s[i]<='Z'){
			string ans="";
			while(chknm(s[i]))ans+=s[i],i++;
			i--;
			for(auto s:bl){
				if(ans==s){
					cout<<"[RESERVED] "<<ans<<endl;
					goto togo;
				}
			}
			cout<<"[NAME] "<<ans<<endl;
			togo:;
		}
	}
	puts("[EOL]");
}signed main(){
	while(getline(cin,s)){
		s+='\n'; 
		MAIN();
	}
	return 0;
}

标签:__,return,int,题解,Lexical,Analyzer,&&,define
From: https://www.cnblogs.com/2011xsy0226xsy/p/18388497

相关文章

  • P6192 【模板】最小斯坦纳树 题解
    Description给定一个包含\(n\)个结点和\(m\)条带权边的无向连通图\(G=(V,E)\)。再给定包含\(k\)个结点的点集\(S\),选出\(G\)的子图\(G'=(V',E')\),使得:\(S\subseteqV'\);\(G'\)为连通图;\(E'\)中所有边的权值和最小。你只需要求出\(E'\)中所有边的权值......
  • BZOJ 4403序列统计题解
    缅怀zxc......
  • CSP-J 2021 初赛试题解析(第三部分:完善程序(2))
    完善程序二完整程序代码#include<iostream>usingnamespacestd;structpoint{intx,y,id;};boolequals(pointa,pointb){returna.x==b.x&&a.y==b.y;}boolcmp(pointa,pointb){returna.x!=b.x?a.x<b.x:a.y<b.y;}......
  • AT_arc170_b 的题解
    (一)因为\(a_i\)较小,那么可以对每一个\(i\),求出它右边离他最近的值为\(j\)的位置。枚举左端点和中间那个数\(a_j\),那么可以求出最小的\(k\)。这样就求出了每个左端点可以取到的最小的\(k\),记为\(b_i\)再从右到左\(b_i=\min(b_i,b_{i+1})\)。(二)AC代码。#include<bi......
  • AGC041D Problem Scores 题解
    在分值不降的条件下,要使任意一个大小为\(k\)的子集\(S\)内题目的分值之和少于任意一个大小为\(k+1\)的子集\(T\)内题目的分值之和,容易发现只需要取\(S\)为后\(k\)道题目,\(T\)为前\(k+1\)道题目时满足限制即可。换而言之,只需要对满足\(a\)的每一段长为\(k+......
  • P7075 [CSP-S2020] 儒略日 题解
    P7075[CSP-S2020]儒略日题面:题目描述为了简便计算,天文学家们使用儒略日(Julianday)来表达时间。所谓儒略日,其定义为从公元前4713年1月1日正午12点到此后某一时刻间所经过的天数,不满一天者用小数表达。若利用这一天文学历法,则每一个时刻都将被均匀的映射到数轴......
  • AT_ddcc2017_final_d なめらかな木 题解
    首先考虑暴力DP,设\(f(i,v_1,v_2,now)\)为已经将前\(i\)个数填入,\(i\)填在\(v_1\),\(j\)填在\(v_2\)点,已经填完点的状态是\(now\)(状压一下存在一个longlong里)的方案数。转移时直接枚举下一个点暴力转移,只需要保证新的点没有被访问过,并且填上新点后,\(v_1\)的所有邻接......
  • Luogu P4425 转盘 题解 [ 黑 ] [ 线段树 ] [ 贪心 ] [ 递归 ]
    转盘:蒟蒻的第一道黑,这题是贪心和线段树递归合并的综合题。贪心破环成链的trick自然不用多说。首先观察题目,很容易发现一个性质:只走一圈的方案一定最优。这个很容易证,因为再绕一圈回来标记前面的和等前面的标记完之后继续走是等价的,并且再绕一圈甚至可能更劣。于是,我们只用走......
  • 题解:P9938 [USACO21OPEN] Acowdemia II B
    前言:原来的tj干了一堆什么建图啊之类的,但其实不要这么复杂。注:下文中\(n\)是各成员名字列表。从\(K=1\)开整。如果情况是\(n_i<n_{i+1}<\cdots<n_j\),那么显然,咱就不知道关于成员\(n_i,\cdots,n_j\)的相对资历的信息。也许所有这帮成员都做出了相同的贡献。......
  • AWTF2024A Moving Slimes 题解
    发现史莱姆不合并也不会影响答案,所以就不用考虑合并了。这样处理之后,史莱姆的移动可以看作是受到与其不在同一位置的史莱姆的吸引所完成的,每只史莱姆可以给其他史莱姆一个单位的吸引力。因为每只史莱姆提供的吸引力是恒定的,所以考虑把吸引力放在它们的重心上,设\(pre_i\)表示坐......