AcWing 31. LL文法
原题链接
困难
作者:
东边的西瓜皮
,
2021-04-01 17:46:55
,
所有人可见
,
阅读 1313
文法描述,简单准确,但可能效率并不是最优的,文法也可以再优化下,但不想弄了
Sym->+ | -
Digit -> 0-9
Digits -> Digit OptDigits
//可为空的数字串
OptDigits -> null | Digits
Integer-> sym digits| digits
Num->
sym Decimal OptExponent
|Decimal OptExponent
//无符号的小数
Decimal->. digits
|Digits.OptDigits
|Digits
//可为空的指数部分
OptExponent -> null |e digits
class Solution {
public:
int i;
//Sym->+ | -
bool isSym(string& s){
if(s[i]=='+'||s[i]=='-'){return true;}
else return false;
}
//Digit -> 0-9
bool isDigit(string &s){
return s[i]>='0'&&s[i]<='9';
}
//Digits -> Digit OptDigits
bool isDigits(string&s){
if(isDigit(s)){
i++;
if(isOptDigits(s))return true;
else return false;
}
return false;
}
//OptDigits -> null | Digits
bool isOptDigits(string &s){
if(isDigits(s))return true;
else return true;
}
//Integer-> sym digits| digits
bool isInteger(string &s){
if(isSym(s)){
i++;
return isDigits(s);
}else{
return isDigits(s);
}
}
/*Num->
sym Decimal OptExponent
Decimal OptExponent
*/
bool isNum(string &s){
if(isSym(s)){
i++;
if(isDecimal(s)){
return isOptExponent(s);
}
}else{
if(isDecimal(s)){
return isOptExponent(s);
}
}
}
/*Decimal->. digits
Digits.OptDigits
Digits
*/
bool isDecimal(string&s){
if(s[i]=='.'){
//cout<<"here";
i++;
return isDigits(s);
}else{
if(isDigits(s)){
if(s[i]=='.'){i++;return isOptDigits(s);}
else return true;
}
}
}
//OptExponent -> null |e digits
bool isOptExponent(string &s){
if(s[i]=='e'||s[i]=='E'){i++;return isInteger(s);}
else return true;
}
bool isNumber(string &s) {
i=0;
auto a=isNum(s);
// cout<<i<<endl;
return a&&i==s.size();
}
};
编译原理!!
大佬,能讲一下原理吗??
这个东西是编译原理里的LL文法