/* rfp_asail.rf */

÷ÓÐÏÍÏÇÁÔÅÌØÎÙÅ ÆÕÎËÃÉÉ, ÉÓÐÏÌØÚÕÅÍÙÅ ËÏÍÐÉÌÑÔÏÒÏÍ

  1. $func Name-To-CPP t.Name = e.legal-cpp-name

    æÕÎËÃÉÑ Name-To-CPP ÐÒÅÏÂÒÁÚÕÅÔ ÔÅÒÍ t.Name × ÉÍÑ ÄÌÑ ÉÓÐÏÌØÚÏ×ÁÎÉÑ × C-ÐÒÏÇÒÁÍÍÅ s.legal-cpp-name É ÐÏÌÕÞÅÎÎÙÊ ÒÅÚÕÌØÔÁÔ ÐÏÍÅÝÁÅÔ × ÔÁÂÌÉÃÕ ÉÍÅÎ &Func-ôÁble É × ÑÝÉË &Func-Names.

    üÔÏ ÎÅ ÓÏ×ÓÅÍ ×ÅÒÎÏ. ëÁË ÄÏÌÖÎÏ ÂÙÔØ ÎÁÐÉÓÁÎÏ × ËÏÍÍÅÎÔÁÒÉÉ:
     * Gets function name or variable and returns legal C++ name corresponding to
     * it. If is called with such parameter at the first time then stores C++ name
     * in the appropriate table for further using. Also put new name in the
     * appropriate box. Box and table for variables is updated for each new
     * function and box and table for functions is updated for each new module.
    

  2. $func Build-CPP-Name e.words = e.cpp-chars

    æÕÎËÃÉÑ Build-CPP-Name ÓÏÚÄÁÅÔ ÕÎÉËÁÌØÎÏÅ ÉÍÑ e.cpp-chars ÐÏ ÓÐÉÓËÕ ÓÌÏ× ÉÚ òÅÆÁÌ-ÐÒÏÇÒÁÍÍÙ e.words .

    îÅÔ, ÐÏÓÔÒÏÅÎÎÏÅ ÉÍÑ ÎÅ ÏÂÑÚÁÎÏ ÂÙÔØ ÕÎÉËÁÌØÎÙÍ. üÔÁ ÆÕÎËÃÉÑ ÐÒÏÓÔÏ ÐÅÒÅ×ÏÄÉÔ e.QualifiedName × ÉÍÑ ÎÁ ó++, ÒÁÓÓÔÁ×ÌÑÑ ‘_’ ÍÅÖÄÕ ÓÌÏ×ÁÍÉ É ÕÂÉÒÁÑ ÓÉÍ×ÏÌÙ, ÎÅ Ñ×ÌÑÀÝÉÅÓÑ ÌÅÇÁÌØÎÙÍÉ × ó++.

  3. $func Find-Unused-Name (e.used-names) e.name = e.unused-name

    æÕÎËÃÉÑ Find-Unused-Name Ñ×ÌÑÅÔÓÑ ×ÓÐÏÍÏÇÁÔÅÌØÎÏÊ ÄÌÑ ÆÕÎËÃÉÉ Build-CPP-Name .

    îÅÔ, ÏÎÁ ÎÅ Ñ×ÌÑÅÔÓÑ ×ÓÐÏÍÏÇÁÔÅÌØÎÏÊ. ïÎÁ ×ÙÚÙ×ÁÅÔÓÑ ÐÏÓÌÅ, ÄÌÑ ÔÏÇÏ, ÞÔÏÂÙ ÓÄÅÌÁÔØ ÐÏÓÔÒÏÅÎÎÏÅ ÉÍÑ ÕÎÉËÁÌØÎÙÍ, ÐÕÔ£Í ÐÒÉÐÉÓÙ×ÁÎÉÑ Ë ÅÇÏ ËÏÎÃÕ ÎÅËÏÔÏÒÏÇÏ ËÏÌ-×Á ‘_’.

  4. $func Word-To-CPP-Chars s.word = e.cpp-chars

    æÕÎËÃÉÑ Word-To-CPP-Chars ÓÏÚÄÁÅÔ ÉÚ ÉÓÈÏÄÎÏÇÏ òÅÆÁÌ-ÓÌÏ×Á s.word ÓÔÒÏËÕ e.cpp-chars ÎÁ C++.

  5. $func Chars-To-CPP-Chars e.chars = e.cpp-chars

    æÕÎËÃÉÑ Chars-To-CPP-Chars ÉÚ ÓÐÉÓËÁ ÓÉÍ×ÏÌÏ× ÎÁ òÅÆÁÌÅ+ e.chars ÓÏÚÄÁÅÔ ÓÐÉÓÏË ÓÉÍ×ÏÌÏ× ÎÁ C++ e.cpp-chars.

  6. $func Expr-Ref-To-CPP s.inner-call? e.ASAIL-Expr-Ref = e.CPP-Expr-Ref

    æÕÎËÃÉÑ Expr-Ref-To-CPP ÐÒÅÏÂÒÁÚÕÅÔ ×ÙÒÁÖÅÎÉÅ-ÓÓÙÌËÕ e.ASAIL-Expr-Ref × ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÅÅ ÅÍÕ ×ÙÒÁÖÅÎÉÅ ÎÁ C++ e.CPP-Expr-Ref.

    ??? ÷Ï×ÓÅ ÎÅÔ! ôÙ ÓÍÏÔÒÅÌÁ ó×ÅÔÉÎÏ ÏÐÉÓÁÎÉÅ ÓÉÎÔÁËÓÉÓÁ? îÅ ×ÙÒÁÖÅÎÉÅ-ÓÓÙÌËÕ, Á ÏÂÙËÎÏ×ÅÎÎÏÅ òÅÆÁÌ-×ÙÒÁÖÅÎÉÅ.

  7. $func Expr-Int-To-CPP e.ASAIL-Expr-Int = e.CPP-Expr-Int

    æÕÎËÃÉÑ Expr-Int-To-CPP ÐÒÅÏÂÒÁÚÕÅÔ ×ÙÒÁÖÅÎÉÅ ÔÉÐÁ Int ÎÁ áéñ × ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÅÅ ÅÍÕ ×ÙÒÁÖÅÎÉÅ ÎÁ C++ .

  8. $func Step-To-CPP e.step-operators = e.cpp-step-operators

    æÕÎËÃÉÑ Step-To-CPP ÐÒÅÏÂÒÁÚÕÅÔ ËÏÎÓÔÒÕËÃÉÉ ÉÎËÒÅÍÅÎÔÁ ÐÅÒÅÍÅÎÎÏÊ ÉÚ ÉÓÈÏÄÎÏÇÏ ÓÐÉÓËÁ e.step-operators × ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÉÅ ËÏÎÓÔÒÕËÃÉÉ ÎÁ C++, ËÏÔÏÒÙÅ ÚÁÐÉÓÙ×ÁÀÔÓÑ × ÓÐÉÓÏË e.cpp-step-operators.

  9. $func Infix-To-CPP s.func-for-converting-args-to-cpp s.op e.args = e.cpp-expr

    æÕÎËÃÉÑ Infix-To-CPP ÐÒÏÎÏÓÉÔ ÚÎÁË ÏÐÅÒÁÃÉÉ s.op ÞÅÒÅÚ ÓÐÉÓÏË ÁÒÇÕÍÅÎÔÏ× e.args, ÜÌÅÍÅÎÔÙ ËÏÔÏÒÏÇÏ ÐÒÅÏÂÒÁÚÕÀÔÓÑ × ÁÒÇÕÍÅÎÔÙ ÎÁ C++ Ó ÐÏÍÏÝØÀ ÆÕÎËÃÉÉ s.func-for-converting-args-to-cpp.

    ñ ÄÕÍÁÀ, ÌÕÞÛÅ ÓËÁÚÁÔØ “ÒÁÓÓÔÁ×ÌÑÅÔ ÚÎÁË ÏÐÅÒÁÃÉÉ ÍÅÖÄÕ ÁÒÇÕÍÅÎÔÁÍÉ e.args”.

  10. $func Op-Arg-To-CPP s.op = s.func-for-converting-args-to-cpp

    æÕÎËÃÉÑ Op-Arg-To-CPP ×ÙÚÙ×ÁÅÔ ÆÕÎËÃÉÀ ÄÌÑ ÏÂÒÁÂÏÔËÉ ÚÎÁËÁ ÏÐÅÒÁÃÉÉ - ÌÏÇÉÞÅÓËÏÊ ÉÌÉ ÁÒÉÆÍÅÔÉÞÅÓËÏÊ.

    îÅÔ. ïÎÁ ×ÏÚ×ÒÁÝÁÅÔ ÆÕÎËÃÉÀ ÄÌÑ ÏÂÒÁÂÏÔËÉ ÁÒÇÕÍÅÎÔÏ× ÏÐÅÒÁÃÉÉ, × ÚÁ×ÉÓÉÍÏÓÔÉ ÏÔ ÔÉÐÁ ÏÐÅÒÁÃÉÉ — ÌÏÇÉÞÅÓËÏÇÏ ÉÌÉ ÁÒÉÆÍÅÔÉÞÅÓËÏÇÏ.

  11. $func Expr-To-CPP e.ASAIL-expr = e.CPP-Expr

    æÕÎËÃÉÑ Expr-To-CPP ÐÏ ÐÏÌÕÞÅÎÎÏÍÕ ÎÁ ×ÈÏÄÅ ×ÙÒÁÖÅÎÉÀ ÎÁ ÁÂÓÔÒÁËÔÎÏÍ ÉÍÐÅÒÁÔÉ×ÎÏÍ ÑÚÙËÅ e.ASAIL-Expr ÓÔÒÏÉÔ ×ÙÒÁÖÅÎÉÅ ÎÁ ÑÚÙËÅ C++ e.CPP-Expr.

    úÄÅÓØ ÐÒÁ×ÉÌØÎÏ ÓËÁÚÁÔØ, ÞÔÏ ÏÎÁ ÄÅÌÁÅÔ ÜÔÏ ÐÕÔ£Í ÏÐÒÅÄÅÌÅÎÉÑ ÔÉÐÁ ×ÙÒÁÖÅÎÉÑ — Expr ÉÌÉ Int, É ×ÙÚÏ×Á ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÅÊ ÆÕÎËÃÉÉ (Expr-Ref-To-CPP ÉÌÉ Expr-Int-To-CPP).

  12. $func Const-Expr-To-CPP e.ASAIL-const-expr = e.CPP-const-expr

    æÕÎËÃÉÑ Const-Expr-To-CPP ÐÏÌÕÞÁÅÔ ÎÁ ×ÈÏÄÅ ËÏÎÓÔÁÎÔÎÏÅ ×ÙÒÁÖÅÎÉÅ ÎÁ áéñ e.ASAIL-const-expr É ÐÒÅÏÂÒÁÚÕÅÔ ÅÇÏ × ËÏÎÓÔÁÎÔÎÏÅ ×ÙÒÁÖÅÎÉÅ ÎÁ ÑÚÙËÅ C++ e.CPP-const-expr

  13. $func Args-To-CPP e.Arg-Res-Tag e.ASAIL-Args = e.CPP-Args

    æÕÎËÃÉÑ Args-To-CPP ÐÏ ÐÏÌÕÞÅÎÎÏÍÕ ÓÐÉÓËÕ ÁÒÇÕÍÅÎÔÏ× ÎÁ áéñ (e.Arg-Res-Tag) e.ASAIL-Args ÓÔÒÏÉÔ ÓÐÉÓÏË ÁÒÇÕÍÅÎÔÏ× ÎÁ ÑÚÙËÅ C++ e.CPP-Args.

    õ ÔÅÂÑ 2 e-×ÙÒÁÖÅÎÉÑ ÎÁ ÏÄÎÏÍ ÕÒÏ×ÎÅ × ÆÏÒÍÁÔÅ ÆÕÎËÃÉÉ. ôÁËÏÇÏ ÎÅ ÍÏÖÅÔ ÂÙÔØ. îÏ Õ ÎÅ£ É × rfp_asail.rf ÆÏÒÍÁÔ ÂÙÌ ÕËÁÚÁÎ ÎÅÐÒÁ×ÉÌØÎÏ. ñ ÉÓÐÒÁ×ÉÌ. îÁÄÏ ÎÁÐÉÓÁÔØ, ÞÔÏ ÆÕÎËÃÉÑ ×ÅÄ£Ô ÓÅÂÑ ÐÏ-ÒÁÚÎÏÍÕ (É ËÁË) × ÚÁ×ÉÓÉÍÏÓÔÉ ÏÔ ÚÎÁÞÅÎÉÑ Tag'Á.

  14. $func Symbol-To-CPP s.RFP-Symbol = e.CPP-String

    æÕÎËÃÉÑ Symbol-To-CPP ÐÏÌÕÞÁeÔ ÎÁ ×ÈÏÄÅ ÓÉÍ×ÏÌ-ÓÌÏ×Ï, ÉÌÉ ÓÉÍ×ÏÌ-ÌÉÔÅÒÕ, ÉÌÉ ÓÉÍ×ÏÌ-ÞÉÓÌÏ s.RFP-Symbol. óÉÍ×ÏÌÙ-ÞÉÓÌÁ ÏÎÁ ÐÅÒÅ×ÏÄÉÔ × ÉÈ ÉÚÏÂÒÁÖÅÎÉÑ, Á ÓÉÍ×ÏÌÙ-ÓÌÏ×Á É ÓÉÍ×ÏÌÙ-ÌÉÔÅÒÙ ÐÅÒÅ×ÏÄÉÔ × ÓÔÒÏËÕ ÌÉÔÅÒ ÎÁ ó++ e.CPP-String.

  15. $func Chars-To-CPP e.expr = e.CPP-String

    æÕÎËÃÉÑ Chars-To-CPP ÐÏÌÕÞÁÅÔ ÎÁ ×ÈÏÄ ÃÅÐÏÞËÕ ÓÉÍ×ÏÌÏ×-ÌÉÔÅÒ e.expr É ÐÒÅÏÂÒÁÚÕÅÔ ÅÇÏ × ÓÔÒÏËÕ ÎÁ C++ e.CPP-String.

  16. $func Cond-To-CPP e.cond = e.CPP-Cond

    æÕÎËÃÉÑ Cond-To-CPP ÎÁ ×ÈÏÄÅ ÐÏÌÕÞÁÅÔ ×ÙÒÁÖÅÎÉÅ-ÕÓÌÏ×ÉÅ ÎÁ áéñ e.cond É ÐÒÅÏÂÒÁÚÕÅÔ ÅÇÏ × ÕÓÌÏ×ÉÅ ÎÁ ÑÚÙËÅ C++ e.CPP-Cond

  17. $func RFP-ASAIL-To-CPP e.asail = e.cpp

    æÕÎËÃÉÑ RFP-ASAIL-To-CPP ÐÏÌÕÞÁÅÔ ÎÁ ×ÈÏÄÅ ×ÙÒÁÖÅÎÉÅ ÎÁ áéñ e.asail É ×ÙÚÙ×ÁÅÔ ÄÁÌÅÅ ÆÕÎËÃÉÀ ASAIL-TO-CPP, ËÏÔÏÒÁÑ ÐÒÅÏÂÒÁÚÕÅÔ ÅÇÏ × ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÅÅ ×ÙÒÁÖÅÎÉÅ ÎÁ C++ e.cpp.

    é ÚÁÞÅÍ ÖÅ ÔÏÇÄÁ ÎÕÖÎÁ ÜÔÁ ÆÕÎËÃÉÑ?

  18. $table Func-Table

    ôÁÂÌÉÃÁ Func-Table ÉÓÐÏÌØÚÕÅÔÓÑ ÄÌÑ ÈÒÁÎÅÎÉÑ ÉÍÅÎ ÆÕÎËÃÉÊ ÎÁ òÅÆÁÌÅ+ É ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÉÈ ÉÍ ÉÍÅÎ ÎÁ C++.

  19. $table Var-Table

    ôÁÂÌÉÃÁ Var-Table ÐÒÅÄÎÁÚÎÁÞÅÎÁ ÄÌÑ ÈÒÁÎÅÎÉÑ ÉÍÅÎ ÐÅÒÅÍÅÎÎÙÈ ÎÁ òÅÆÁÌÅ+ É ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÉÈ ÉÍ ÉÍÅÎ ÎÁ ó++, ÉÓÐÏÌØÚÕÅÍÙÈ × ÆÕÎËÃÉÉ.

  20. $box Func-Names

    ñÝÉË Func-Names ÐÒÅÄÎÁÚÎÁÞÅÎ ÄÌÑ ÈÒÁÎÅÎÉÑ ÉÍÅÎ ÆÕÎËÃÉÊ, ÐÏÓÔÒÏÅÎÎÙÈ × ÐÒÏÇÒÁÍÍÅ.

  21. $box Var-Names

    ñÝÉË Var-Names ÐÒÅÄÎÁÚÎÁÞÅÎ ÄÌÑ ÈÒÁÎÅÎÉÑ ÉÍÅÎ ÐÅÒÅÍÅÎÎÙÈ, ÉÓÐÏÌØÚÕÅÍÙÈ × ÆÕÎËÃÉÉ.

ëÏÎÓÔÒÕËÃÉÉ áéñ É ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÉÅ ÉÍ ËÏÎÓÔÒÕËÃÉÉ ó++

(FUNC t.name (e.args) (e.ress) e.body)

RF_FUNC (t.name', ((RF_ARG) Vars e.args'), ((RF_RES) Vars e.ress'))) e.body' RF_END,

ÇÄÅ t.name' - ÐÒÅÏÂÒÁÚÏ×ÁÎÎÏÅ ÉÍÑ ÏÐÉÓÙ×ÁÅÍÏÊ ÆÕÎËÃÉÉ Ó ÐÏÍÏÝØÀ ÆÕÎËÃÉÉ Name-To-CPP, RF_ARG - ÓÐÉÓÏË ÁÒÇÕÍÅÎÔÏ× ÞÅÒÅÚ ÐÒÏÂÅÌ, a RF_RES ÓÐÉÓÏË ÉÍÅÎ ÒÅÚÕÌØÔÁÔÏ× ÞÅÒÅÚ ÐÒÏÂÅÌ.

äÁÖÅ ÚÎÁÑ, ÞÔÏ ÄÏÌÖÎÏ ÂÙÔØ, Ñ ÎÅ ÍÏÇÕ ÐÏÎÑÔØ, ÞÔÏ ÚÄÅÓØ ÎÁÐÉÓÁÎÏ. þÔÏ ÔÁËÏÅ ÔÏÇÄÁ Vars, e.args', e.ress'? é ÓËÏÂËÉ, ËÁË ×ÓÅÇÄÁ, ÎÅ ÓÂÁÌÁÎÓÉÒÏ×ÁÎÙ.

(IF (e.cond) e.body)

if (e.cond') {

e.body' },

ÇÄÅ e.cond' É e.body'ÐÏÌÕÞÁÀÔÓÑ ÐÒÅÏÂÒÁÚÏ×ÁÎÉÅÍ e.cond É e.body Ó ÐÏÍÏÝØÀ ÆÕÎËÃÉÊ Cond-To-CPP É ÒÅËÕÒÓÉ×ÎÏÇÏ ×ÙÚÏ×Á ASAIL-To-CPP

(FOR (e.label) (e.cond) (e.step) e.body)

for ( ; e.cond'; e.step'){

e.body'

e.label' },

ÇÄÅ e.cond' - ÒÅÚÕÌØÔÁÔ ÐÒÅÏÂÒÁÚÏ×ÁÎÉÑ e.cond ÆÕÎËÃÉÅÊ Cond-To-CPP , e.step' ÐÏÌÕÞÅÎÏ ÐÒÅÏÂÒÁÚÏ×ÁÎÉÅÍ e.step Ó ÐÏÍÏÝØÀ ÆÕÎËÃÉÉ Step-To-CPP, e.label' ÐÒÅÏÂÒÁÚÏ×ÁÎÎÏÅ ÉÍÑ ÍÅÔËÉ e.label (ÏÎÏ ÍÏÖÅÔ ÂÙÔØ ÐÕÓÔÙÍ),É e.body' -ÒÅÚÕÌØÔÁÔ ÐÒÅÏÂÒÁÚÏ×ÁÎÉÑ e.body ÒÅËÕÒÓÉ×ÎÙÍ ×ÙÚÏ×ÏÍ ÆÕÎËÃÉÉ ASAIL-To-CPP

(LABEL t.label e.body)

{ e.body' } LABEL t.name' : { } ,

ÇÄÅ e.body' ÐÏÌÕÞÁÅÔÓÑ ÐÕÔÅÍ ÐÒÅÏÂÒÁÚÏ×ÁÎÉÑ e.body ÒÅËÕÒÓÉ×ÎÏ ÆÕÎËÃÉÅÊ RFP-ASAIL-To-CPP, t.name' - ÒÅÚÕÌØÔÁÔ ÒÁÂÏÔÙ ÆÕÎËÃÉÉ Name-To-CPP ÎÁÄ ÁÒÇÕÍÅÎÔÏÍ (LABEL t.label)

(TRY e.body)

trap { e.body' }

ÚÄÅÓØ e.body' ÐÏÌÕÞÅÎÏ × ÒÅÚÕÌØÔÁÔÅ ÒÁÂÏÔÙ ÆÕÎËÃÉÉ ASAIL-To-CPP ÎÁÄ ÁÒÇÕÍÅÎÔÏÍ e.body

(CATCH-ERROR e.body)

with { e.body' },

ÇÄÅ e.body' ÐÏÌÕÞÅÎÏ × ÒÅÚÕÌØÔÁÔÅ ÒÁÂÏÔÙ ÆÕÎËÃÉÉ ASAIL-To-CPP ÎÁÄ ÁÒÇÕÍÅÎÔÏÍ e.body. éÓÐÏÌØÚÕÅÔÓÑ ÄÌÑ ÏÂÒÁÂÏÔËÉ ÉÓËÌÀÞÉÔÅÌØÎÙÈ ÓÉÔÕÁÃÉÊ.

(CONST e.expr)

const e.expr',

ÇÄÅ e.expr' ÐÏÌÕÞÁÅÔÓÑ ÐÒÅÏÂÒÁÚÏ×ÁÎÉÅÍ e.expr Ó ÐÏÍÏÝØÀ ÆÕÎËÃÉÉ Expr-To-CPP

RETURN

return true;

RETFAIL

retfail;

FATAL

FATAL (“Unexpected fail”);

(LSPLIT e.expr (e.min) t.var1 t.var2)

lsplit (e.expr', e.min', e.var1', e.var2');,

ÇÄÅ e.expr' É e.min' ÒÅÚÕÌØÔÁÔ ÐÒÅÏÂÒÁÚÏ×ÁÎÉÑ e.expr Ó ÐÏÍÏÝØÀ ÆÕÎËÃÉÉ Expr-Ref-To-CPP É e.min Ó ÐÏÍÏÝØÀ ÆÕÎËÃÉÉ Expr-Int-To-CPP, e.var1' É e.var2' ÐÏÌÕÞÅÎÙ × ÒÅÚÕÌØÔÁÔÅ ÒÁÂÏÔÙ ÆÕÎËÃÉÉ Name -To-CPP ÎÁÄ ÁÒÇÕÍÅÎÔÁÍÉ e.var1, e.var2 . æÕÎËÃÉÑ ÉÓÐÏÌØÚÕÅÔÓÑ ÄÌÑ ÒÁÚÂÉÅÎÉÑ ×ÙÒÁÖÅÎÉÑ e.expr' ÎÁ Ä×Á ×ÙÒÁÖÅÎÉÑ: e.var1' É e.var2', ÄÌÉÎÁ e.var1' ÒÁ×ÎÁ e.min', ÄÌÉÎÁ e.var2' ÒÁ×ÎÁ ÄÌÉÎÅ ÏÓÔÁÔËÁ ÏÔ ×ÙÒÁÖÅÎÉÑ e.expr'. äÁÌÅÅ ÜÔÉ ×ÙÒÁÖÅÎÉÑ ÍÏÇÕÔ ÂÙÔØ ÉÓÐÏÌØÚÏ×ÁÎÙ × ÃÉËÌÅ.

(RSPLIT e.expr (e.min) t.var1 t.var2)

rsplit (e.expr', e.min', e.var1', e.var2');,

ÇÄÅ e.expr' É e.min' ÒÅÚÕÌØÔÁÔ ÐÒÅÏÂÒÁÚÏ×ÁÎÉÑ e.expr Ó ÐÏÍÏÝØÀ ÆÕÎËÃÉÉ Expr-Ref-To-CPP É e.min Ó ÐÏÍÏÝØÀ ÆÕÎËÃÉÉ Expr-Int-To-CPP, e.var1' É e.var2' ÐÏÌÕÞÅÎÙ × ÒÅÚÕÌØÔÁÔÅ ÒÁÂÏÔÙ ÆÕÎËÃÉÉ Name -To-CPP ÎÁÄ ÁÒÇÕÍÅÎÔÁÍÉ e.var1, e.var2 . æÕÎËÃÉÑ ÉÓÐÏÌØÚÕÅÔÓÑ ÄÌÑ ÒÁÚÂÉÅÎÉÑ ×ÙÒÁÖÅÎÉÑ e.expr' ÎÁ Ä×Á ×ÙÒÁÖÅÎÉÑ: e.var1' É e.var2', ÄÌÉÎÁ e.var2' ÒÁ×ÎÁ e.min', ÄÌÉÎÁ e.var1' ÒÁ×ÎÁ ÄÌÉÎÅ ÏÓÔÁÔËÁ ÏÔ ×ÙÒÁÖÅÎÉÑ e.expr'. äÁÌÅÅ ÜÔÉ ×ÙÒÁÖÅÎÉÑ ÍÏÇÕÔ ÂÙÔØ ÉÓÐÏÌØÚÏ×ÁÎÙ × ÃÉËÌÅ.

(ASSIGN t.var e.expr)

t.var' = e.expr'; -

ÏÐÅÒÁÔÏÒ ÐÒÉÓ×ÁÉ×ÁÎÉÑ, ÚÄÅÓØ t.var' - ÒÅÚÕÌØÔÁÔ ÒÁÂÏÔÙ ÆÕÎËÃÉÉ Name-To-CPP ÎÁÄ ÁÒÇÕÍÅÎÔÏÍ t.var, e.expr' - ÒÅÚÕÌØÔÁÔ ÒÁÂÏÔÙ ÆÕÎËÃÉÉ Expr-To-CPP ÎÁÄ ÁÒÇÕÍÅÎÔÏÍ e.expr

(DECL s.type t.var)

s.type t.var'; -

ÏÂßÑ×ÌÅÎÉÅ ÐÅÒÅÍÅÎÎÏÊ, ÇÄÅ t.var' ÐÏÌÕÞÅÎÏ ÐÕÔÅÍ ÐÒÅÏÂÒÁÚÏ×ÁÎÉÑ t.var Ó ÐÏÍÏÝØÀ ÆÕÎËÃÉÉ Name-To-CPP

(EXPR e.expr)

Expr (e.expr'); -

ÓÏÚÄÁÎÉÅ ÏÂßÅËÔÁ ËÌÁÓÁ Expr, ÇÄÅ e.expr'- ÐÒÅÏÂÒÁÚÏ×ÁÎÎÏÅ ×ÙÒÁÖÅÎÉÅ e.expr Ó ÐÏÍÏÝØÀ ÆÕÎËÃÉÉ Chars-To-CPP

(DEREF e.expr (e.pos))

Expr (e.expr', e.pos'); -

ÓÏÚÄÁÎÉÅ ÏÂßÅËÔÁ ËÌÁÓÓÁ Expr, ÇÄÅ t.var' ÐÏÌÕÞÁÅÔÓÑ × ÒÅÚÕÌØÔÁÔÅ ÐÒÅÏÂÒÁÚÏ×ÁÎÉÑ t.var Ó ÐÏÍÏÝØÀ ÆÕÎËÃÉÉ Name-To-CPP, e.expr' - ÒÅÚÕÌØÔÁÔ ÐÒÅÏÂÒÁÚÏ×ÁÎÉÑ e.expr ÆÕÎËÃÉÅÊ Expr-Ref-To-CPP, e.pos' ÐÏÌÕÞÅÎo ÐÕÔÅÍ ÐÒÅÏÂÒÁÚÏ×ÁÎÉÑ e.pos Ó ÐÏÍÏÝØÀ ÆÕÎËÃÉÉ Expr-Int-To-CPP

á ÞÔÏ ÔÁËÏÅ t.var? äÅÌÏ × ÔÏÍ, ÞÔÏ ÅÓÔØ ÐÏ Ä×Á ×ÁÒÉÁÎÔÁ DEREF É SUBEXPR. äÌÑ ÚÁ×ÅÄÅÎÉÑ ÎÏ×ÏÊ ÐÅÒÅÍÅÎÎÏÊ, É ÄÌÑ ÉÓÐÏÌØÚÏ×ÁÎÉÑ ×ÎÕÔÒÉ ×ÙÒÁÖÅÎÉÑ, ËÏÇÄÁ ÐÅÒÅÍÅÎÎÁÑ ÎÅ ÚÁ×ÏÄÉÔÓÑ É, ÓÏÏÔ×ÅÔÓÔ×ÅÎÎÏ, t.var ÎÅÔÕ. á Õ ÔÅÂÑ ÏÐÉÓÁÎÏ ÔÏÌØËÏ ÐÏ ÏÄÎÏÍÕ ×ÁÒÉÁÎÔÕ ËÁÖÄÏÊ ËÏÎÓÔÒÕËÃÉÉ.

(SUBEXPR t.var e.expr (e.pos) (e.len))

Expr t.var' (e.expr', e.pos', e.len'); -

ÓÏÚÄÁÎÉÅ ÏÂßÅËÔÁ ËÌÁÓÓÁ Expr, ÇÄÅ t.var' - ÐÒÅÏÂÒÁÚÏ×ÁÎÎÏÅ ÉÍÑ ÐÅÒÅÍÅÎÎÏÊ t.var É e.expr' ÐÏÌÕÞÅÎÏ ÐÒÅÏÂÒÁÚÏ×ÁÎÉÅÍ e.expr ÆÕÎËÃÉÅÊ Expr-Ref-To-CPP, e.pos',e.len' - ×ÙÒÁÖÅÎÉÑ, ÐÏÌÕÞÅÎÎÙÅ ÐÒÅÏÂÒÁÚÏ×ÁÎÉÅÍ e.pos, e.len Ó ÐÏÍÏÝØÀ ÆÕÎËÃÉÉ Expr-Int-To-CPP

(DROP t.var)

t.var'.drop();,

ÇÄÅ t.var' - ÐÒÅÏÂÒÁÚÏ×ÁÎÎÏÅ ÉÍÑ ÐÅÒÅÍÅÎÎÏÊ t.var Ó ÐÏÍÏÝØÀ ÆÕÎËÃÉÉ Name-To-CPP. ðÏÓÌÅ ÔÏÇÏ, ËÁË ÏÔÒÁÂÏÔÁÌÁ ÜÔÁ ÆÕÎËÃÉÑ, ÐÅÒÅÍÅÎÎÁÑ t.var' ÎÉÇÄÅ ÄÁÌÅÅ ÎÅ ÉÓÐÏÌØÚÕÅÔÓÑ.

(CONTINUE t.label)

goto t.label'; -

ÏÐÅÒÁÔÏÒ goto, ÇÄÅ t.label' ÐÏÌÕÞÅÎÏ × ÒÅÚÕÌØÔÁÔÅ ×ÙÚÏ×Á ÆÕÎËÃÉÉ Name-To-CPP ÎÁÄ ÁÒÇÕÍÅÎÔÏÍ t.label

(BREAK t.label)

goto t.label'; -

ÏÐÅÒÁÔÏÒ goto, ÇÄÅ t.label' ÐÏÌÕÞÅÎÏ × ÒÅÚÕÌØÔÁÔÅ ×ÙÚÏ×Á ÆÕÎËÃÉÉ Name-To-CPP ÎÁÄ ÁÒÇÕÍÅÎÔÏÍ t.label

(ERROR e.expr)

error (e.expr');

ÇÅÎÅÒÁÃÉÑ ÓÏÏÂÝÅÎÉÑ ÏÂ ÏÛÉÂËÅ, ÇÄÅ e.expr' ÐÏÌÕÞÁÅÔÓÑ × ÒÅÚÕÌØÔÁÔÅ ÒÁÂÏÔÙ ÆÕÎËÃÉÉ Expr-Ref-To-CPP ÎÁÄ ÁÒÇÕÍÅÎÔÏÍ e.expr

(CONSTEXPR t.name e.expr)

const Expr t.name' = e.expr';

ÉÎÉÃÉÁÌÉÚÁÃÉÑ ËÏÎÓÔÁÎÔÎÏÇÏ ×ÙÒÁÖÅÎÉÑ, ÇÄÅ t.name' - ÒÅÚÕÌØÔÁÔ ÒÁÂÏÔÙ ÆÕÎËÃÉÉ Name-To-CPP ÎÁÄ ÁÒÇÕÍÅÎÔÏÍ t.name, Á e.expr' - ÒÅÚÕÌØÔÁÔ ÒÁÂÏÔÙ ÆÕÎËÃÉÉ Const-Expr-To-CPP ÎÁÄ ÁÒÇÕÍÅÎÔÏÍ e.expr

(DECL-FUNC t.name)

(RF_DECL (t.name'))

ÓÏÚÄÁÎÉÅ ÏÂßÑ×ÌÅÎÉÑ ÆÕÎËÃÉÉ, ÇÄÅ t.name' - ÅÅ ÉÍÑ, ÐÏÌÕÞÅÎÎÏÅ ÉÚ t.name Ó ÐÏÍÏÝØÀ ×ÙÚÏ×Á Name-To-CPP.

(s.call t.name (e.exprs) (e.ress))

RF_CALL (t.name', (Exprs e.expr'), (Vars e.ress'));

RF_TAILCALL (t.name', (Exprs e.expr'), (Vars e.ress'));

ÚÄÅÓØ ÚÎÁÞÅÎÉÅÍ s.call ÍÏÖÅÔ ÂÙÔØ ËÁË RF_CALL, ÔÁË É RF_TAILCALL, e.args É e.ress' ÐÏÌÕÞÅÎÙ ÉÚ e.exprs É e.ress Ó ÐÏÍÏÝØÀ ÆÕÎËÃÉÉ Args-To-CPP, t.name' ÐÏÌÕÞÅÎÏ ÉÚ t.name Ó ÐÏÍÏÝØÀ ÆÕÎËÃÉÉ Name-To-CPP

þÔÏ ÚÁ Exprs É Vars? îÉÞÅÇÏ ÔÁËÏÇÏ ÔÁÍ ÎÅ ÄÏÌÖÎÏ ÂÙÔØ!

(PAREN e.expr)

(e.expr')(),

ÇÄÅ e.expr' ×ÙÒÁÖÅÎÉÅ, ÐÏÌÕÞÅÎÎÏÅ ÐÒÅÏÂÒÁÚÏ×ÁÎÉÅÍ e.expr ÆÕÎËÃÉÅÊ Expr-Ref-To-CPP

(LENGTH e.expr)

(int) (e.expr').get_len();,

ÇÄÅ e.expr' ÐÏÌÕÞÅÎÏ ÐÕÔÅÍ ÐÒÅÏÂÒÁÚÏ×ÁÎÉÑ e.expr ÆÕÎËÃÉÅÊ Expr-Ref-To-CPP . æÕÎËÃÉÑ ×ÏÚ×ÒÁÝÁÅÔ ÄÌÉÎÕ ×ÙÒÁÖÅÎÉÑ e.expr', Á ÉÍÅÎÎÏ, ËÏÌÉÞÅÓÔ×Ï ÔÅÒÍÏ×, ÉÚ ËÏÔÏÒÙÈ ÏÎÏ ÓÏÓÔÏÉÔ.

(SYMBOL? e.expr (e.pos))

(e.expr').symbol_at(e.pos'),

ÇÄÅ e.expr' - ÒÅÚÕÌØÔÁÔ ÐÒÅÏÂÒÁÚÏ×ÁÎÉÑ e.expr ÆÕÎËÃÉÅÊ Expr-Ref-To-CPP É e.pos' Ñ×ÌÑÅÔÓÑ ÒÅÚÕÌØÔÁÔÏÍ ÒÁÂÏÔÙ ÆÕÎËÃÉÉ Expr-Int-To-CPP . æÕÎËÃÉÑ ÐÒÏ×ÅÒÑÅÔ, ÎÁÈÏÄÉÔÓÑ ÌÉ × ÐÏÚÉÃÉÉ e.pos' ×ÙÒÁÖÅÎÉÑ e.expr' ÓÉÍ×ÏÌ.

(FLAT-SUBEXPR? E.expr (e.pos) (e.len))

(e.expr').flat_at(e.pos', e.len'),

ÇÄÅ e.expr' ÐÏÌÕÞÅÎo × ÒÅÚÕÌØÔÁÔÅ ÒÁÂÏÔÙ ÆÕÎËÃÉÉ Expr-Ref-To-CPP ÎÁÄ ÁÒÇÕÍÅÎÔÏÍ e.expr, e.pos', e.len' ÐÏÌÕÞÅÎÙ × ÒÅÚÕÌØÔÁÔ ÒÁÂÏÔÙ ÆÕÎËÃÉÉ Expr-Int-To-CPP æÕÎËÃÉÑ ÐÒÏ×ÅÒÑÅÔ, ÎÅ ÓÏÄÅÖÉÔ ÌÉ ÐÏÄ×ÙÒÁÖÅÎÉÅ, ÎÁÞÉÎÁÀÝÅÅÓÑ Ó ÐÏÚÉÃÉÉ e.pos' ÄÌÉÎÙ e.len' ×ÙÒÁÖÅÎÉÑ e.expr' ×ÌÏÖÅÎÎÙÈ ÔÅÒÍÏ×.

(EQ (e.expr1) (e.pos1) (e.len1) (e.expr2) (e.pos2) (e.len2))

eq (e.expr1', e.pos1', e.len1', e.expr2', e.pos2', e.len2'),

ÇÄÅ e.expr1', e.expr2' ÐÏÌÕÞÅÎÙ Ó ÐÏÍÏÝØÀ ÆÕÎËÃÉÉ Expr-Ref-To-CPP, ÐÒÉÍÅÎÅÎÎÏÊ Ë ÁÒÇÕÍÅÎÔÁÍ e.expr1, e.expr2, e.pos1', e.pos2', e.len1', e.len2' ÐÏÌÕÞÅÎÙ ÐÒÉÍÅÎÅÎÉÅÍ ÆÕÎËÃÉÉ Expr-Int-To-CPP Ë ÁÒÇÕÍÅÎÔÁÍ e.pos1, e.pos2, e.len1, e.len2 æÕÎËÃÉÑ ÐÒÏ×ÅÒÑÅÔ ÒÁ×ÅÎÓÔ×Ï ÐÏÄ×ÙÒÁÖÅÎÉÑ ×ÙÒÁÖÅÎÉÑ e.expr1, ÎÁÞÉÎÁÑ Ó ÐÏÚÉÃÉÉ e.pos1 ÄÌÉÎÙ e.len1 ÐÏÄ×ÙÒÁÖÅÎÉÀ ×ÙÒÁÖÅÎÉÑ e.expr2, ÎÁÞÉÎÁÑ Ó ÐÏÚÉÃÉÉ e.pos2 ÄÌÉÎÙ e.len2.

(FLAT-EQ (e.expr1) (e.pos1) (e.expr2) (e.pos2) (e.len))

flat_eq (e.expr1', e.pos1', e.expr2', e.pos2', e.len'),

ÇÄÅ e.expr1' , e.expr2' ÐÏÌÕÞÁÀÔÓÑ × ÒÅÚÕÌØÔÁÔÅ ÒÁÂÏÔÙ ÆÕÎËÃÉÉ Expr-Ref-To-CPP ÎÁÄ ÁÒÇÕÍÅÎÔÁÍÉ e.expr1, e.expr2,. e.pos1', e.pos2', e.len' ÐÏÌÕÞÁÀÔÓÑ × ÒÅÚÕÌØÔÁÔÅ ÒÁÂÏÔÙ ÆÕÎËÃÉÉ Expr-Int-to-CPP ÎÁÄ ÁÒÇÕÍÅÎÔÁÍÉ e.pos1, e.pos2, e.len. æÕÎËÃÉÑ ×ÙÚÙ×ÁÅÔÓÑ ÄÌÑ ÐÒÏ×ÅÒËÉ ÒÁ×ÅÎÓÔ×Á Ä×ÕÈ ×ÈÏÄÎÙÈ ×ÙÒÁÖÅÎÉÊ, Ñ×ÌÑÀÝÉÈÓÑ ÐÏÄ×ÙÒÁÖÅÎÉÑÍÉ e.expr1, e.expr2, ÎÁÞÉÎÁÑ Ó ÐÏÚÉÃÉÊ e.pos1, e.pos2 ÓÏÏÔ×ÅÔÓÔ×ÅÎÎÏ,ÅÓÌÉ ÉÚ×ÅÓÔÎÏ, ÞÔÏ ÉÈ ÄÌÉÎÙ ÒÁ×ÎÙ.

(NOT e.cond)

(! e.cond'),

ÏÐÅÒÁÔÏÒ ÏÔÒÉÃÁÎÉÑ ÕÓÌÏ×ÉÑ e.cond', ÐÏÌÕÞÅÎÎÏÇÏ ÐÒÅÏÂÒÁÚÏ×ÁÎÉÅÍ ÕÓÌÏ×ÉÑ e.cond Ó ÐÏÍÏÝØÀ ÆÕÎËÃÉÉ Cond-To-CPP

(INC-ITER t.var)

iter (t.var')++,

ÏÐÅÒÁÃÉÑ ÉÎËÒÅÍÅÎÔÁ ÄÌÑ ÏÂßÅËÔÁ ËÌÁÓÓÁ iter

(MAX e.args)

max (Ints e.args'),

ÇÄÅ e.args' - ÒÅÚÕÌØÔÁÔ ÐÒÅÏÂÒÁÚÏ×ÁÎÉÑ e.args ÆÕÎËÃÉÅÊ Args-To-CPP . æÕÎËÃÉÑ ×ÏÚ×ÒÁÝÁÅÔ ÍÁËÓÉÍÁÌØÎÏÅ ÚÎÁÞÅÎÉÅ ÉÚ ÓÐÉÓËÁ ÃÅÌÏÞÉÓÌÅÎÎÙÈ ÁÒÇÕÍÅÎÔÏ× e.args'.

îÅÔÕ ÔÁÍ ÎÉËÁËÉÈ Ints!

(MIN e.args)

min (Ints e.args')),

ÇÄÅ e.args' - ÐÏÌÕÞÅÎÙ ÉÚ e.args Ó ÐÏÍÏÝØÀ ÆÕÎËÃÉÉ Args-To-CPP. æÕÎËÃÉÑ ×ÏÚ×ÒÁÝÁÅÔ ÍÉÎÉÍÁÌØÎÏÅ ÚÎÁÞÅÎÉÅ ÉÚ ÓÐÉÓËÁ ÃÅÌÏÞÉÓÌÅÎÎÙÈ ÁÒÇÕÍÅÎÔÏ× e.args'.

îÅÔÕ ÔÁÍ ÎÉËÁËÉÈ Ints!

(INFIX s.op e.args)

e.arg' s.op e.arg'',

ÇÄÅ e.arg', e.arg'' - ÁÒÇÕÍÅÎÔÙ ÉÚ ÓÐÉÓËÁ e.args, s.op - ÓÉÍ×ÏÌ ÏÐÅÒÁÃÉÉ.

á ËÁËÉÅ ÜÔÏ ÁÒÇÕÍÅÎÔÙ — ÐÅÒ×ÙÊ É ×ÔÏÒÏÊ, ÉÌÉ ÐÏÓÌÅÄÎÉÊ É ÐÒÅÄÐÏÓÌÅÄÎÉÊ?

(REF e.QualifiedName)

e.QualifiedName'

ÕÎÉËÁÌØÎÙÊ ÉÄÅÎÔÉÆÉËÁÔÏÒ C++

(VAR (e.QualifiedName))

e.QualifiedName'

ÕÎÉËÁÌØÎÏÅ ÉÍÑ ÐÅÒÅÍÅÎÎÏÊ

(LABEL (e.QualifiedName))

e.QualifiedName'

ÕÎÉËÁÌØÎÏÅ ÉÍÑ ÍÅÔËÉ

(e.QualifiedName)

e.QualifiedName'

ÕÎÉËÁÌØÎÙÊ ÉÄÅÎÔÉÆÉËÁÔÏÒ ó++