рдХреЛрдХреЛ / рдЖрд░ рдХрдВрдкрд╛рдЗрд▓рд░реНрд╕ рдФрд░ рдЯреНрд░рд╛рдВрд╕рд▓реЗрдЯрд░реНрд╕
рдХрд╛ рдПрдХ рдЬрдирд░реЗрдЯрд░ рд╣реИ, рдЬреЛ рдХрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╡реНрдпрд╛рдХрд░рдг рдПрдХ рд╕реНрдХреИрдирд░ (рд▓реЗрдХреНрд╕рд┐рдХрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ) рдФрд░ рдПрдХ рдкрд╛рд░реНрд╕рд░ (рдкрд╛рд░реНрд╕рд░) рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рд╕реНрдХреИрдирд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдирд┐рдпрддрд╛рддреНрдордХ рдкрд░рд┐рдорд┐рдд рд░рд╛рдЬреНрдп рдорд╢реАрди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╡рдВрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
1. рд╡реНрдпрд╛рдХрд░рдгрдЬрдирд░реЗрдЯрд░ RBNF рдХреЗ рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдХ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рдкрд╛рд░реНрд╕рд░ рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╡рдВрд╢ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ, рдФрд░ рдпрд╣ рдКрдкрд░ рд╕реЗ рдиреАрдЪреЗ рддрдХ рдкрд╛рд░реНрд╕ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдлрд┐рд░ рд╡реНрдпрд╛рдХрд░рдг рдПрд▓рдПрд▓ (рдХреЗ) рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдПрд▓рдПрд▓ (1), рд▓реЗрдХрд┐рди рдХреЛрдХреЛ / рдЖрд░ рдореЗрдВ рд╕рдВрдШрд░реНрд╖ рд╕рдорд╛рдзрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдПрд▓рдПрд▓ (1) рд╕рдВрдШрд░реНрд╖реЛрдВ рдХреЛ рд╢рдмреНрджрд╛рд░реНрде рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЯреЛрдХрди рдХреЛ рдЖрдЧреЗ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╡реНрдпрд╛рдХрд░рдг рдПрд▓рдПрд▓ (1) рд╣реИ рдпрджрд┐ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЙрддреНрдкрд╛рджреЛрдВ рдХреЗ рд▓рд┐рдП S-> A | B рд╢рд░реНрддреЛрдВ рд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рд╣реИрдВ:
1. рдРрд╕рд╛ рдХреЛрдИ рдЯрд░реНрдорд┐рдирд▓ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП A рдФрд░ B рдПрдХ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд░реЗрдЦрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВред
2. рдПрдХ рдЦрд╛рд▓реА рд▓рд╛рдЗрди рдЙрддреНрдкрд╛рджреЛрдВ A рдпрд╛ B рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред
3. рдпрджрд┐ e рд╕реЗрдЯ FIRST (B) рдХреЗ рдЕрдВрддрд░реНрдЧрдд рдЖрддрд╛ рд╣реИ, рддреЛ FIRST (A) FOLLOW (S) рд╕реЗрдЯ - рдкреНрд░рддрд┐рдЪреНрдЫреЗрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдПрдлрдЖрдИрдПрд╕рдЯреА (рдП) рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдИ рдХреЗ рд▓рд┐рдП рдЗрд╕реА рддрд░рд╣ рдХрд╛ рдПрдХ рдмрдпрд╛рди рднреА рд╕рдЪ рд╣реИред
2. рднрд╛рд╖рд╛ рдХреЛрдХреЛ / рдЖрд░рдЬрдирд░реЗрдЯрд░ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдХреЛрдб рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ: рдЬрд╛рд╡рд╛, C ++, C #, F #, VB.Net, Oberonред
рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, C ++ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рд╕рднреА рдирд┐рдпрдо рдПрдХ рдЕрд╡рдзрд┐ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред
рдлреЙрд░реНрдо S-> AB рдХреЗ рдЙрддреНрдкрд╛рджреЛрдВ рдХреЛ S = A B рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред
| - рдпрд╛
() - рд╕рдореВрд╣
[] - реж рдпрд╛ рез
{} - 0 рдпрд╛ рдЕрдзрд┐рдХ
реи.рез рдЖрдпрд╛рдд, рдЕрд░реНрдерд╛рддреНред рд╣реЗрдбрд░ рдХрд╛ рдХрдиреЗрдХреНрд╢рдиред#include <string> #include <sstream> #include <iostream> #include <fstream> #include <vector>
2.2 рдХрдВрдкрд╛рдЗрд▓рд░ рдЖрдИрдбреА , рдпрд╛рдиреА COMPILER рдХреАрд╡рд░реНрдб рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдЖрдкрдХрд╛ рд╡реНрдпрд╛рдХрд░рдг рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред
рдХрдореНрдкрд┐рд▓рд░ рдПрдХреНрд╕рдк
2.3 рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдФрд░ рдХрд╛рд░реНрдпредCOMPILER рдХреАрд╡рд░реНрдб рдХреЗ рдмрд╛рдж, рдЖрдк рдЪрд░ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдиреБрднрд╛рдЧ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдХрдИ рдХрд╛рд░реНрдп рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдЕрд▓рдЧ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд░рдЦрдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдФрд░ рдЙрдирдХреЗ рдмрд┐рдирд╛ рд╡реНрдпрд╛рдХрд░рдг рдмрд╣реБрдд рдбрд░рд╛рд╡рдирд╛ рдФрд░ рдЕрдкрдардиреАрдп рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
int toInt(const std::wstring& strbuf) { std::wstringstream converter; int value = 0; converter << strbuf; converter >> value; return value; } std::wstring toString ( int Number ) { std::wostringstream ss; ss << Number; return ss.str(); }
2.4 рд╕реНрдХреИрдирд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдоред2.4.1 рдХреЗрд╕-рдЕрд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдХреЗ рд▓рд┐рдП IGNORECASE рдХреАрд╡рд░реНрдбред
реи.рек.реи рдЕрдХреНрд╖рд░ - рд╡рд╣ рдЦрдВрдб рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдорд╛рдиреНрдп рд╡рд░реНрдгреЛрдВ рдХреЗ рд╕рдореБрдЪреНрдЪрдп рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рдкрддреНрд░ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдХреНрдпрд╛ рд╣реИред
рд╡рд░реНрдг
рдЕрдХреНрд╖рд░ = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"ред
рдЕрдВрдХ = "0123456789"ред
рдпрд╣рд╛рдБ рд╡рд┐рднрд╛рдЬрдХ рд╡рд░реНрдгреЛрдВ рдХрд╛ рднреА рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
cr = '\ r'ред
lf = '\ n'ред
рдЯреИрдм = '\ t'ред
рдлреЙрд░реНрдо 1 рдХрд╛ рдПрдХ рдЕрдВрдХрди .. char2 char1 рд╕реЗ char2 рддрдХ рд╡рд░реНрдгреЛрдВ рдХреЗ рдПрдХ рдХреНрд░рдо рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред
рдЕрдВрдХ = '0' .. '9'ред
рдХреЛрдИ рднреА - рд╡рд░реНрдгреЛрдВ рдХрд╛ рдХреЛрдИ рднреА рдХреНрд░рдоред
+ рдХрдИ рд╕рд╣рд┐рдд
- рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡рд░реНрдгреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рджреЛрд╣рд░реЗ рдЙрджреНрдзрд░рдг рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИрдВ:
verbatimStringChar = рдХреЛрдИ рднреА - '' ''ред
рд╣реЗрдХреНрд╕рд╛рдбреЗрд╕рд┐рдорд▓ рд╕рдВрдХреЗрддрди рдХреЗ рд▓рд┐рдП рд╡рд░реНрдгреЛрдВ рдХрд╛ рд╕рдореВрд╣:
hexDigit = рдЕрдВрдХ + "ABCDEFabcdef"ред
2.4.3 рдЯреЛрдХрди рд╕реНрд╡рдпрдВ, рдпрд╛ рджреВрд╕рд░рд╛ рдирд╛рдо - рдЯреЛрдХрдиред рдЕрдиреБрднрд╛рдЧ рдХреАрд╡рд░реНрдб TOKENS рд╣реИред рд╣рдо рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдЯреЛрдХрди рдФрд░ рд╕рдВрдЦреНрдпрд╛ рдЯреЛрдХрди рд╕реЗ рд╣рдорд╛рд░рд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИред
рдЯреЛрдХрди
рдкрд╣рдЪрд╛рди = рдкрддреНрд░ {рдкрддреНрд░ | рдЕрдВрдХ | "_"}ред
рд╕рдВрдЦреНрдпрд╛ = рдЕрдВрдХ {рдЕрдВрдХ}ред
рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЯреЛрдХрди, рджреЛрд╣рд░реЗ рдХреЛрдЯреНрд╕ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рд╡рд░реНрдгреЛрдВ рдХреЗ рдХрд┐рд╕реА рднреА рдХреНрд░рдо рдХреА рддрд░рд╣:
string = "\" "{verbatimStringChar}" \ ""ред
рд╣реЗрдХреНрд╕рд╛рдбреЗрд╕рд┐рдорд▓ рд╕рдВрдЦреНрдпрд╛:
hex = "0x" {hexDigit hexDigit}ред
реи.рек.рек рд╡рд┐рд╢реЗрд╖ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рдзрд╛рд░рд╛ред
2.4.5 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБред
рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ "/ *" рд╕реЗ "* /" рдиреЗрд╕реНрдЯреЗрдб
рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ FROM "//" рдХреЗ рд▓рд┐рдП cr lf
2.4.6 рд╡рд┐рднрд╛рдЬрдХред рд╣рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдХрд┐рди рд╡рд┐рднрд╛рдЬрдХреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддреЗ рд╣реИрдВред
IGNORE cr + lf + рдЯреИрдм
2.5 рдирд┐рдпрдо рдПрдХ рдкрд╛рд░реНрд╕рд░ рдкреИрджрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПредрдкреНрд░реЛрдбрдХреНрд╢рдВрд╕ рдХреАрд╡рд░реНрдб рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВред
рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╡реНрдпрд╛рдХрд░рдг рдЙрджрд╛рд╣рд░рдг:
Expr = рдкрд╣рдЪрд╛рди ': =' NumExpr ';'
NumExpr = рд╢рдмреНрдж {('+' | '-') NumExpr}
рд╢рдмреНрдж = рдЧреБрдгрдХ {('*' | '/') рд╢рдмреНрдж}
рдЧреБрдгрдХ = рдкрд╣рдЪрд╛рди | рдирдВрдмрд░ | '(' NumExpr ')'
рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдХреЛрд╖реНрдардХ <> рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдЯрд╛рд▓ рд╕реЗ рдХреБрдЫ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕реВрдЪреА рдореЗрдВ, рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдбреЙрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХреЛрд╖реНрдардХ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрд░реНрдерд╛рддред <ред ред>ред
рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдЧреИрд░-рдЯрд░реНрдорд┐рдирд▓реЛрдВ рдкрд░ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕реЗ рдПрдХ рдЧреИрд░-рд╡рд┐рд╖рдпрдХ рдореЗрдВ рд▓рдкреЗрдЯ рд╕рдХрддреЗ рд╣реИрдВ:
LogOp <std :: wstring & op> = ("(&&" | "||") (.op =--> valред)ред
рд╕рд┐рдореЗрдВрдЯрд┐рдХ рдХреНрд░рд┐рдпрд╛рдПрдВ рдХреЛрд╖реНрдардХ (..) рдХреЗ рд╕рд╛рде рдХреЛрд╖реНрдардХ рдореЗрдВ рд▓рд┐рдЦреА рдЬрд╛рддреА рд╣реИрдВред рдпрд╣ рд╡рд╣ рдХреЛрдб рд╣реИ рдЬрд┐рд╕реЗ рдЬрдирд░реЗрдЯрд░ рдкрд╛рд░реНрд╕рд░ рдореЗрдВ рдбрд╛рд▓реЗрдЧрд╛ред рдХреЛрдб рдЙрд╕ рднрд╛рд╖рд╛ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд▓реЗрд╕рд░ рдФрд░ рдкрд╛рд░реНрд╕рд░ рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВред
рдХреЛрдИ рднреА - рдкрд╛рд░реНрд╕рд░ рд╕реЗрдХреНрд╢рди рдореЗрдВ рдпрд╣ рдХреАрд╡рд░реНрдб рдХрд┐рд╕реА рднреА рдЯреЛрдХрди рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рд╣рдо "рдЯреЗрдХреНрд╕реНрдЯ" рдХреЛ {Any} рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
реи.рем рдЕрдВрдд рдХреАрд╡рд░реНрдб , рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ реи.реи рдореЗрдВ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рдмрд╛рдж рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдирд╛рдоред
3. рд╕рдВрдШрд░реНрд╖ рдХрд╛ рд╕рдВрдХрд▓реНрдкредрдпрд╣ рд╕рдордЭрдирд╛ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╡реНрдпрд╛рдХрд░рдг рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЬрдирд░реЗрдЯрд░ рдбрд░рд╛рд╡рдиреЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рд╢рдкрде рд▓реЗрдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИред
3.1 рдХрд╛рд░рдХредрдирд┐рдпрдо рдПрдХ рд╣реА рдЯреЛрдХрди рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВред рдЬрдирд░реЗрдЯрд░ рдХрдИ рд╡рд┐рдХрд▓реНрдк рд▓рд┐рдЦрддрд╛ рд╣реИ
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
S-> a '=' B | a '(' C ')' '
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, 2 рдирд┐рдпрдо рдЯреЛрдХрди "рдП" рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВ, рдЬреЛ рдкрд╣рд▓реЗ рдирд┐рдпрдо рдПрд▓рдПрд▓ (1) рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддрд╛ рд╣реИред рдЗрд╕реЗ S-> a ('=' B '(' C ')' 'рдХреЗ рд░реВрдк рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВред
рдХреБрдЫ рд╕рдВрдШрд░реНрд╖, рдЬреИрд╕реЗ рдХрд┐-рдФрд░, рд╣рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдХрдерди = рдпрджрд┐ '(' рдЗрдкреНрд░ ')' рдХрдерди [рдФрд░ рдХрдерди]ред
if (a> b) рдЕрдЧрд░ (a> c) max = a; рдФрд░ рдЕрдзрд┐рдХрддрдо = рдмреА;
рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдХреНрдпрд╛ рдЪреБрдирдирд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХ рд╕рдордЭреМрддрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛: рдкрд╣рд▓рд╛ рд╡рд┐рдХрд▓реНрдк рдЪреБрдиреЗрдВред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╡рд┐рдХрд▓реНрдк рд╕рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЗ рд╡реНрдпрд╛рдХрд░рдг рдореЗрдВ рдРрд╕реА рдЕрд╕реНрдкрд╖реНрдЯрддрд╛рдУрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИред
рдмреБрд░рд╛ рд░рд┐рдХреЙрд░реНрдбред
рдПрд╕ = [рдПрдХ рдЖрдИрдбреА рдмреА] рдПред
рдП = рдЖрдИрдбреА {.id}ред
рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдирд┐рдпрдо рдХреЛ рдЪреБрдирдирд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ [рдЖрдИрдбреА рдмреА] рдФрд░ рдПрдХ рд╣реА рдЯреЛрдХрди рдХреЗ рд╕рд╛рде рдПрдХ рд╢реБрд░реБрдЖрддред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡реНрдпрд╛рдХрд░рдг рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ:
S = a id (b A | {{Id})ред
рей.реи рд╡рд╛рдо рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐редрдПрд▓рдПрд▓ рд╡реНрдпрд╛рдХрд░рдг рдХреЗ рд▓рд┐рдП рд╡рд╛рдо рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╡реИрдз рдирд╣реАрдВ рд╣реИред рдЗрд╕реЗ рд░реВрдкрд╛рдВрддрд░рдг рджреНрд╡рд╛рд░рд╛ рд╣рдЯрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдХрд┐рд╕реА рднреА рдмрд╛рдИрдВ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЛ рджрд╛рдИрдВ рдУрд░ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЙрежтАФ> рдЖ рез | ... | рдЖрди | рдм рез ... | рдмреНрдо
рдкрд░
A-> b1B | .. | bmB
B-> a1B | .. | aB | e |
рдЖрд░рдмреАрдПрдирдПрдл рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб:
рдП = рдП рдмреА | рд╕реАред
рдкрд░
рдП = рд╕реА {рдмреА}ред
рей.рей рдЕрд░реНрде рдорд╣рддреНрд╡редрдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдирд┐рдпрдореЛрдВ рдХреЛ рдЙрдирдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде:
Expr = Factor {тАЩ+тАЩ Factor}ред
рдХрд╛рд░рдХ = '(' рдкрд╣рдЪрд╛рди ')' рдХрд╛рд░рдХ | тАЩ(Ex рдПрдХреНрд╕рдкреНрд░тАЩ тАЩ) | рдкрд╣рдЪрд╛рди | рдирдВрдмрд░ред
рдпрд╛рдиреА рдРрд╕рд╛ рд╡реНрдпрд╛рдХрд░рдг рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
рдП + рдмреА
(a) + рдмреА
(int) a + b
рдЕрдВрддрд┐рдо рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ, рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рджреНрд╡рд╛рд░рд╛ '(' рдкрд╣рдЪрд╛рди ') рдХрд╛рд░рдХ рдирд┐рдпрдо рдХрд╛ рдЪреБрдирд╛рд╡ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╛рдиреА рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣рдЪрд╛рди рд╣реИ, рддреЛ рдпрд╣ рдирд┐рдпрдо рдЪреБрдирд╛ рдЧрдпрд╛ рд╣реИред
! рднрд╛рд╖рд╛ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдПрдХ рдЕрддреНрдпрдВрдд рдЕрд╕рдлрд▓ рдЙрджрд╛рд╣рд░рдгред рдЖрдорддреМрд░ рдкрд░, рдПрдХ рд╡реНрдпрд╛рдХрд░рдг рдореЗрдВ, "рдХреАрд╡рд░реНрдб" рдХрд╛ рд╡рд░реНрдгрди рдПрдХ рдЕрд▓рдЧ рдирд┐рдпрдо рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдлрд┐рд░ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдЬрд╛рдВрдЪ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдгред
A = рдкрд╣рдЪрд╛рди (ред X = 1;;) {',' рдкрд╣рдЪрд╛рди (.x ++ ++;)} ':' рдкрд╣рдЪрд╛рди (.Foo ();) {',' рдкрд╣рдЪрд╛рди (.bar) (;))} ';'ред
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡реНрдпрд╛рдХрд░рдг рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдирд┐рдпрдо рдХреЗ рд╕рдорд╛рди рднрд╛рдЧреЛрдВ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╢рдмреНрджрд╛рд░реНрде рдХреНрд░рд┐рдпрд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВред рдПрдХ рдирд┐рдпрдо рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдмреГрд╣рджрд╛рдиреНрддреНрд░ рдпрд╛ рдЕрд░реНрдзрд╡рд┐рд░рд╛рдо рд╕реЗ рдкрд╣рд▓реЗ рд╕рднреА рдЯреЛрдХрди рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж рд╣реА рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛ рдХрд┐ рдХреМрди рд╕рд╛ рдирд┐рдпрдо рдЪреБрдирдирд╛ рд╣реИред
рд╕рдорд╛рдзрд╛рди:
рдЖрдк рд╡реНрдпрд╛рдХрд░рдг рдореЗрдВ рдПрдХ рдмреВрд▓рд┐рдпрди рдлрд╝рдВрдХреНрд╢рди рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдПрд╕ = [рдПрдХ рдЖрдИрдбреА рдмреА] рдПред
рдП = рдЖрдИрдбреА {.id}ред
рдПрд╕ = рдПрдХ [рдЖрдИрдПрдл (рдЗрд▓рд┐рдпрд╛рд╕ ()) рдЖрдИрдбреА рдмреА] рдПред
IsAlias тАЛтАЛ() рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рд╕рд╛рдордиреЗ 2 рдЯреЛрдХрди рд╕реНрдХреИрди рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ b рд╣реИ, рддреЛ рд╕рд╣реА рд╣реИред
рдЯреЛрдХрди рдЯреА - рдмрд╕ рдорд╛рдиреНрдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рдЯреЛрдХрди
рдЯреЛрдХрди рд▓рд╛ - рдЕрдЧрд▓реЗ рдЯреЛрдХрди
t.val - рдЯреЛрдХрди рдореВрд▓реНрдп
t.kind - рдЯреЛрдХрди рдХрд╛ рдкреНрд░рдХрд╛рд░, рдЬреЛ рд▓реЗрдХреНрд╕рд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
A = IF (FollowedByColon ())
рдкрд╣рдЪрд╛рди (? x = 1;;) {',' рдкрд╣рдЪрд╛рди (.x ++;);)}:
| рдкрд╣рдЪрд╛рди (.Foo ();) {',' рдкрд╣рдЪрд╛рди (рдмрд╛рд░ ();))} ';'ред
bool FollowedByColon(){ // Token x = la; // while(x.kind==_comma || x.kind== _ident) // x=scanner.Peek(); // true, return x.kind==_colon; }
рдЯрд┐рдкреНрдкрдгреА:
рдпрджрд┐ рдЬрдирд░реЗрдЯрд░ рднрд╛рд╖рд╛ рдХреАрд╡рд░реНрдбред
FollowedByColon () рдлрд╝рдВрдХреНрд╢рди рдкрд╣рд▓реЗ рдирд┐рдпрдо рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЕрдЧрд░ рд╡рд╣ рд╕рдЪ рд╣реИ, рддреЛ рдпрд╣ рд╡рд╣ рд╣реИ рдЬреЛ рдЗрд╕реЗ рдорд╛рдирддрд╛ рд╣реИред
рд╕реНрдХреИрдирд░ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдирд╛рдо рд╕реНрдХреИрдирд░ рджреНрд╡рд╛рд░рд╛ рджрд┐рдП рдЧрдП рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк TOKENS рд╕реЗрдХреНрд╢рди рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВ
рдкрд╣рдЪрд╛рди = рдкрддреНрд░ {рдкрддреНрд░ | рдЕрдВрдХ | "_"}ред
рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо = ','ред
рдЕрд░реНрдзрд╡рд┐рд░рд╛рдо = ';'ред
рдХреЛрд▓рди = ':'ред
рдпрд╣ рд╕реНрдХреИрдирд░ рдЕрдЪреНрдЫреЗ рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рд░рд╛рдВрдХ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛:
const int _EOF = 0;
const int _ident = 1;
const int _comma = 2;
const int _semicolon = 3;
const int _colon = 4;
рднрд╛рд╖рд╛ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рддреАрдХ рдХреЗ рдЯреЛрдХрди рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рд╡рд┐рд╡рд░рдг рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЖрдЧреЗ рдЯреЛрдХрди рдХрд╛ рд╕рддреНрдпрд╛рдкрди рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рддреЛ рдРрд╕рд╛ рд╡рд┐рд╡рд░рдг рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдпрджрд┐ рдкрд╣рд▓реЗ рдирд┐рдпрдо рдореЗрдВ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдерд╛ рдЬрд┐рд╕рдореЗрдВ рдЖрдкрдиреЗ рдЯреЛрдХрди рдХреА рдЬрд╛рдВрдЪ рдХреА рдереА, рдФрд░ рджреВрд╕рд░реЗ рдирд┐рдпрдо рдореЗрдВ рднреА рдЖрдкрдХрд╛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рддреЛ рд╕реНрдХреИрдирд░ рдХреЛ рдЕрдкрдиреА рдореВрд▓ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╡рд╛рдкрд╕ рдЖрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдк рд╕реНрдХреИрдирд░ рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рддрд┐ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ редesetPeek () рдлрд╝рдВрдХреНрд╢рдиред
4. рдирдореВрдирд╛ рдХреЛрдбрд╣рдо рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдиреЛрдЯреЗрд╢рди рдореЗрдВ рддрдмреНрджреАрд▓ рдХрд░рддреЗ рд╣реИрдВред рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡реНрдпрд╛рдХрд░рдг рджреНрд╡рд╛рд░рд╛ рдШрдЯрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
Expr = рдкрд╣рдЪрд╛рди ': =' NumExpr ';'
NumExpr = рд╢рдмреНрдж {('+' | '-') NumExpr}
рд╢рдмреНрдж = рдЧреБрдгрдХ {('*' | '/') рд╢рдмреНрдж}
рдЧреБрдгрдХ = рдкрд╣рдЪрд╛рди | рдирдВрдмрд░ | '(' NumExpr ')'
atg рдлрд╝рд╛рдЗрд▓:
#include <string> #include <sstream> #include <iostream> #include <fstream> #include <vector> COMPILER expr int toInt(const std::wstring& strbuf) { std::wstringstream converter; int value = 0; converter << strbuf; converter >> value; return value; } std::wstring toString ( int Number ) { std::wostringstream ss; ss << Number; return ss.str(); } IGNORECASE CHARACTERS letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz". digit = "0123456789". cr = '\r'. lf = '\n'. tab = '\t'. TOKENS ident = letter {letter | digit | "_"}. number = digit {digit}. COMMENTS FROM "/*" TO "*/" NESTED COMMENTS FROM "//" TO cr lf IGNORE cr + lf + tab PRODUCTIONS expr (.std::wstring str;.) = (.std::wstring s,s1,s2,s3,s4; .) ident (.s1=t->val;.)":=" NumExpr<s2> ";" (. str+=s1; str+=s2; str+=L":=\n";.) {ident(.s3=t->val; s4=L"";.)":=" NumExpr<s4> ";" (. s+=s3; s+=s4; s+=L":=\n"; .)} (. str+=s; std::wofstream outfile ("out.txt", std::ios_base::out); outfile << str << std::endl; outfile.close(); .) . NumExpr<std::wstring &str> = (.std::wstring s1,s2, op; .) Term<s1> (.str+=s1;.) { ("+" (.op=L"+";.)|"-" (.op=L"-";.)) NumExpr<s2> (. str+=s2; str+=op; .) }. Term<std::wstring &str> =(.std::wstring s1,s2, op;.) Multiplier<s1> (.str+=s1;.) { ("*" (.op=L"*";.)|"/"(.op=L"/";.)) Term<s2> (. str+=s2; str+=op; .) }. Multiplier<std::wstring &str> = ident (.str=t->val; .) | number (.str=t->val;.) | (.std::wstring s; .) "(" NumExpr<s> ")" (.str=s;.). END expr.
рдореБрдЦреНрдп:
#include <iostream> #include <wchar.h> #include "Parser.h" #include "Scanner.h" #include <string> using namespace std; main(int argc, char *argv[]) { if (argc == 2) { wchar_t *file = coco_string_create(argv[1]); Scanner *scanner = new Scanner(file); Parser *parser = new Parser(scanner); parser->Parse(); delete parser; delete scanner; delete file; return 0; } else { cout << "Use: translator filename" << endl; return 1; } }
рдмрдирд╛рдиреЗ:
all: translator translator: Coco scanner.o parser.o main.o g++ -o tr.exe scanner.o parser.o main.o main.o: main.cpp g++ -c main.cpp scanner.o: Scanner.cpp Scanner.h g++ -c Scanner.cpp -o scanner.o parser.o: Parser.cpp Parser.h g++ -c Parser.cpp -o parser.o Coco: expr.atg coco expr.atg clean: del Scanner.cpp Scanner.h Parser.cpp Parser.h del Scanner.cpp.old Scanner.h.old Parser.cpp.old Parser.h.old del scanner.o parser.o main.o del translator
рд╡реНрдпрд╛рдХрд░рдг рдкрд╛рд░реНрд╕рд░ рдлрд╝рдВрдХреНрд╢рди
void Parser::NumExpr(std::wstring &str) { std::wstring s1,s2, op; Term(s1); str+=s1; while (la->kind == 5 || la->kind == 6) { if (la->kind == 5) { Get(); op=L"+"; } else { Get(); op=L"-"; } NumExpr(s2); str+=s2; str+=op; } }
рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐
a: = b;
a: = a-5;
a: = 9-5 + 2;
a: = 2 + 3 * 4;
a: = (5-4) * (3 + 2);
рдЙрддреНрдкрд╛рджрди
ab: =
рдЖ рел -: =
a952 + -: =
a234 * +: =
a54-32 + *: =