Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
...
expr ::= expr '+' expr
expr ::= expr '-' expr
expr ::= expr '*' expr
expr ::= expr '/' expr
multiplier ::= ... | '(', expr, ')'.
addendum ::= multiplier, { ('*' | '/'), addendum }.
expr ::= addendum, { ('+' | '-'), expr }.
expr ::= (expr '+' expr) | (expr '-' expr) | (expr '*' expr) | (expr '/' expr) expr ::= expr ('+'|'-'|'*'|'/') expr expr ::= expr ('+'expr |'-'expr |'*'expr |'/'expr ) Таким образом для написания парсера не требуется умения обращаться с другими программами генерации парсеров.
read_expr(...) {
return read_expr1(...) && read_expr2(...) && read_expr3(...);
}
template<class it_t>
error_t read_expr_a(it_t & it,...) {
it_t tmp = it;
error_t err;
if(err = read_expr1(it,...) && read_expr2(it,...) && read_expr3(it,...))
return true;
it = tmp;
return err;
}
template<class it_t>
error_t read_expr_b(it_t & it,...) {
return read_expr1(it,...) || read_expr2(it,...) || read_expr3(it,...);
}
return reifnot_E(it,read_expr1(it,...)&&E2F(read_expr2(it,...))&&E2F(read_expr2(it,...)))
||reifnot_E2F(it,read_expr4(it,...));
return reifnot_E(it,read(it)>>expr1(...)>>expr2(...)>>expr2(...))
||reifnot_E2F(it,read_expr4(it,...));
#define METHOD(it,fun,met) [=](decltype(it) & it){ return fun(it).met; }
return expr1(...) >> expr2(...) >> expr3(...) || expr4(...);
base_parse_error err;
auto it1=it;
ifnot(err=read_expr1(it,...))
goto met;
ifnot(err=err&&read_expr2(it,...)
goto met:
ifnot(err=err&&read_expr3(it,...)
goto met:
return err;//err==true
met:
it=it1;
return err||read_expr4(it,...);
return reifnot_E(it,read(it)>>expr1(...)>>expr2(...)>>expr2(...))
||E2F(read_expr4(it,...));
typedef char var;
int var, var1;
var * var1;
#include <iostream>
using namespace std;
struct foo{
public:
foo(int i){
cout<<"type"<<endl;
}
int operator+(int){
cout <<"foo+int"<<endl;
return 2;
}
};
int foo(int i){
cout <<"fun"<<endl;
return 1;
}
int main(){
cout << (foo(5)+4) <<endl;
}
Способ написания синтаксических анализаторов на c++