rt,在嗯偶挨批厄林厄肆前一天晚上突然发电写模拟,以RE告终,虽 bingfs ,仍不知其缘由,遂发帖求助。
代码(猎奇码风致歉)↓
#include<bits/stdc++.h>
#define Flandre std
using namespace Flandre;
typedef long long ll;
bitset<49> WARNING1[55];
queue<int> WARNING2;
inline vector<string> split(const string &org){
vector<string> res;
string tmp = "";
for(int i=0;i<org.length();++i){
if(org[i]==' '){
if(!tmp.empty())res.push_back(tmp);
tmp = "";
}else tmp+=org[i];
}if(!tmp.empty())res.push_back(tmp);
return res;
}
inline bool startWith(const string &org,const string &pre){
if(org.length()<pre.length())
return 0;
for(int i=0;i<pre.length();++i){
if(pre[i]==org[i])continue;
if(pre[i]==org[i]-'a'+'A')continue;
if(pre[i]==org[i]-'A'+'a')continue;
return 0;
}return 1;
}
inline bool isNum(const string &org){
for(auto chr:org)
if((!('0'<=chr&&chr<='9'))&&(chr!='-'))return 0;
return 1;
}
inline bool isOper(const string &org){
for(auto chr:org){
if(chr=='=')continue;
if(chr=='>')continue;
if(chr=='<')continue;
if(chr=='+')continue;
if(chr=='-')continue;
if(chr=='*')continue;
if(chr=='/')continue;
return 0;
}return 1;
}
int LINE,N;
unordered_map<int,int> ENDIF;
int stacIF[495],top=-1;
bitset<49> globalVari;
inline void preIF(vector<string> *codes){
for(LINE=2;LINE<=N;LINE++){
if(startWith(codes[LINE][0],"IF"))
stacIF[++top]=LINE;
if(startWith(codes[LINE][0],"END"))
if(top>-1)
ENDIF[stacIF[top]]=LINE,top--;
}
}
bool globalUnreachable = 0;
inline void runIF(vector<string> *codes,const int &IF,const int &END,bitset<49> &upVari){
bitset<49> ifVari = upVari;
bitset<49> elseVari = upVari;
bitset<49> *localVari = &ifVari;
for(int i=1;i<codes[IF].size();i++){
if(startWith(codes[IF][i],"THEN"))break;
if(isOper(codes[IF][i]))continue;
if(isNum(codes[IF][i]))continue;
if(!(*localVari)[codes[LINE][i][0]-'A'])
WARNING1[IF].set(codes[IF][i][0]-'A');
}
bool unreachable = 0;
bool retInElse = 0;
bool retInIf = 0;
bool inElse = 0;
for(LINE=IF+1;LINE<END;LINE++){
if(startWith(codes[LINE][0],"IF")){
runIF(codes,LINE,ENDIF[LINE],*localVari);
continue;
}
if(startWith(codes[LINE][0],"END"))
continue;
if(startWith(codes[LINE][0],"ELSE")){
unreachable = 0;
inElse = 1;
localVari = &elseVari;
continue;
}
if(unreachable){
WARNING2.push(LINE);
continue;
}
if(startWith(codes[LINE][0],"RETURN")){
if(codes[LINE].size()==2){
if(!(*localVari)[codes[LINE][1][0]-'A'])
WARNING1[LINE].set(codes[LINE][1][0]-'A');
}
unreachable = 1;
if(inElse)
retInElse = 1;
else
retInIf = 1;
continue;
}
for(int i=1;i<codes[LINE].size();i++){
if(isOper(codes[LINE][i]))continue;
if(isNum(codes[LINE][i]))continue;
if(!(*localVari)[codes[LINE][i][0]-'A'])
WARNING1[LINE].set(codes[LINE][i][0]-'A');
}
(*localVari).set(codes[LINE][0][0]-'A');
}
if(retInIf&&retInElse)globalUnreachable = 1;
for(int i=0;i<26;i++)
if((ifVari[i]||retInIf)&&(elseVari[i]||retInElse)&&(!upVari[i]))
upVari.set(i);
}
inline void param(vector<string> &code){
for(int i=1;i<code.size();i++)
globalVari.set(code[i][0]-'A');
}
vector<string> codes[55];
inline void compile(){
param(codes[1]);
preIF(codes);
for(LINE=2;LINE<=N;LINE++){
if(startWith(codes[LINE][0],"IF")){
runIF(codes,LINE,ENDIF[LINE],globalVari);
continue;
}if(startWith(codes[LINE][0],"END"))
continue;
if(globalUnreachable){
WARNING2.push(LINE);
continue;
}
if(startWith(codes[LINE][0],"RETURN")){
if(codes[LINE].size()==2){
if(!globalVari[codes[LINE][1][0]-'A'])
WARNING1[LINE].set(codes[LINE][1][0]-'A');
}
globalUnreachable = 1;
continue;
}
for(int i=1;i<codes[LINE].size();i++){
if(isOper(codes[LINE][i]))continue;
if(isNum(codes[LINE][i]))continue;
if(!globalVari[codes[LINE][i][0]-'A'])
WARNING1[LINE].set(codes[LINE][i][0]-'A');
}
globalVari.set(codes[LINE][0][0]-'A');
}
}
inline void warning(){
for(LINE=2;LINE<=N;LINE++){
if((!WARNING2.empty())&&WARNING2.front()==LINE){
cout<<"Line "<<LINE<<": unreachable code\n";
WARNING2.pop();
continue;
}
if(!WARNING1[LINE].count())continue;
for(int i=0;i<26;i++)
if(WARNING1[LINE][i])
cout<<"Line "<<LINE<<": variable "<<(char)(i+'A')<<" might not have been initialized\n";
}
}
string input;
int main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
while(getline(cin,input))codes[++N] = split(input);
compile();
warning();
return 0;
}
祝各位选手 RP++