AcWing 31. LL文法
原题链接
困难
作者:
东边的西瓜皮
,
2021-04-01 17:46:55
,
所有人可见
,
阅读 1335
文法描述,简单准确,但可能效率并不是最优的,文法也可以再优化下,但不想弄了
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;
bool isSym(string& s){
if(s[i]=='+'||s[i]=='-'){return true;}
else return false;
}
bool isDigit(string &s){
return s[i]>='0'&&s[i]<='9';
}
bool isDigits(string&s){
if(isDigit(s)){
i++;
if(isOptDigits(s))return true;
else return false;
}
return false;
}
bool isOptDigits(string &s){
if(isDigits(s))return true;
else return true;
}
bool isInteger(string &s){
if(isSym(s)){
i++;
return isDigits(s);
}else{
return isDigits(s);
}
}
bool isNum(string &s){
if(isSym(s)){
i++;
if(isDecimal(s)){
return isOptExponent(s);
}
}else{
if(isDecimal(s)){
return isOptExponent(s);
}
}
}
bool isDecimal(string&s){
if(s[i]=='.'){
i++;
return isDigits(s);
}else{
if(isDigits(s)){
if(s[i]=='.'){i++;return isOptDigits(s);}
else return true;
}
}
}
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);
return a&&i==s.size();
}
};
编译原理!!
大佬,能讲一下原理吗??
这个东西是编译原理里的LL文法