⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 actions.g

📁 編譯器的accent語法分析器
💻 G
字号:
-- ACCENT -- -- A Compiler Compiler for the Entire Class of Context-Free Languages-- -- Copyright (C) 1999  Friedrich Wilhelm Schroeer-- -- This program is free software; you can redistribute it and/or modify-- it under the terms of the GNU General Public License as published by-- the Free Software Foundation; either version 2 of the License, or-- (at your option) any later version.-- -- This program is distributed in the hope that it will be useful,-- but WITHOUT ANY WARRANTY; without even the implied warranty of-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the-- GNU General Public License for more details.-- -- You should have received a copy of the GNU General Public License-- along with this program; if not, write to the Free Software-- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.'module' actions'use'   bnf   encode   verbose   code'export'   put_actions'action' put_actions   'rule' put_actions      GrammarClass <- cfg      -- GrammarClass <- ll1      PreludeBlock -> Blk      put_CodeBlock("", Blk, "")      Put("#include \"yygrammar.h\"") Nl      (|	 GrammarClass -> cfg      ||	 Put("int yycursym;")      |)      init_indentation      LabelCount <- 1      LHS_List -> Keys      -- put_fwd_decl_LHSKEYS(Keys)      put_actions_LHSKEYS(Keys)      fix_code'var' GrammarClass: GRAMMARCLASS'type' GRAMMARCLASS   ll1   cfg---/* forward decls (C++) 'action'  put_fwd_decl_LHSKEYS(LHSKEYS)   'rule' put_fwd_decl_LHSKEYS(keys(Keys, Key))      put_fwd_decl_LHSKEYS(Keys)      put_fwd_decl_LHSKEY(Key)   'rule' put_fwd_decl_LHSKEYS(nil)'action' put_fwd_decl_LHSKEY(LHSKEY)   'rule' put_fwd_decl_LHSKEY(Key)      Key'Lhs -> Lhs      [|         -- put LHS	 where(Lhs -> nonterm(Id))	 HasMeaning(Id -> nontermobj(_,_,FP))	 Nl	 id_to_string(Id -> Str)	 Put(Str)	 Put(" (")	 handle_formal_params(FP)	 Put(")")	 Put(";")	 Nl      |]      */---'action'  put_actions_LHSKEYS(LHSKEYS)   'rule' put_actions_LHSKEYS(keys(Keys, Key))      put_actions_LHSKEYS(Keys)      put_actions_LHSKEY(Key)   'rule' put_actions_LHSKEYS(nil)'action' put_actions_LHSKEY(LHSKEY)   'rule' put_actions_LHSKEY(Key)      Key'Lhs -> Lhs      [|         -- put LHS	 where(Lhs -> nonterm(Id))	 HasMeaning(Id -> nontermobj(_,_,FP))	 Nl	 id_to_string(Id -> Str)	 Put(Str)	 Put(" (")	 handle_formal_params_1(FP)	 Put(")")	 Nl	 LocalNames <- nil	 handle_formal_params_2(FP)         -- put RHS         Key'Clauses -> Clauses	 Put("{") Nl	 indentation(+1)	 local_declarations(Clauses)	 Key'RulePrelude -> Prelude	 put_CodeBlock("", Prelude, "")	 (|	    GrammarClass -> cfg	    indent	    Put("switch(yyselect()) {")	    Nl	 ||	    indent	 |)         put_actions_for_nonterm_CLAUSEKEYS(Clauses)	 (|	    GrammarClass -> cfg	    indent	    Put("}") Nl	 ||	    -- "indent" called already	    Put("yysyntaxerror();")	    Nl	 |)	 indentation(-1)	 indent	 Put("}") Nl      |]'action' put_actions_for_nonterm_CLAUSEKEYS(CLAUSEKEYS)   'rule' put_actions_for_nonterm_CLAUSEKEYS(clausekeys(Keys, Key))      put_actions_for_nonterm_CLAUSEKEYS(Keys)      put_actions_for_nonterm_CLAUSEKEY(Key)   'rule' put_actions_for_nonterm_CLAUSEKEYS(nil)'action' put_actions_for_nonterm_CLAUSEKEY(CLAUSEKEY)   'rule' put_actions_for_nonterm_CLAUSEKEY(ClauseKey)      ClauseKey'GrammarRef -> members(Members)      ClauseKey'Number -> Number      (|	 GrammarClass -> cfg	 indent	 Put("case ")	 PutI(Number)	 Put(": {")	 Nl      ||	 -- "indent" called already	 Put("if (TABLE[")	 PutI(Number)	 Put("][yycursym]) {")	 Nl      |)      indentation(+1)      put_actions_MEMBERLIST(Members)      (|	 GrammarClass -> cfg         indent         Put("} break;") Nl         indentation(-1)      ||         indentation(-1)	 indent	 Put("} else ")	 -- no Newline      |)'action' put_actions_MEMBERLIST(MEMBERLIST)   'rule' put_actions_MEMBERLIST(list(H, T))      put_actions_MEMBER(H)      put_actions_MEMBERLIST(T)   'rule' put_actions_MEMBERLIST(nil)'action' put_actions_MEMBER(MEMBER)   'rule' put_actions_MEMBER(call(Id, Params, _, Pos))      id_to_string(Id -> Str)      (|	 HasMeaning(Id -> tokenobj(N, FParams))	 (|	    GrammarClass -> cfg	    indent	    Put("get_lexval();")	    Nl	 ||	    indent	    Put("yycheck(")	    PutI(N)	    Put(");")	    Nl	 |)	 handle_token_params(Params, FParams, 1)	 (|	    GrammarClass -> cfg	 ||	    indent	    Put("yycursym = yylex();")	    Nl	 |)      ||	 HasMeaning(Id -> nontermobj(_,_,Formals))	 indent	 Put(Str)	 Put("(")	 handle_actual_params(Params, Formals)	 Put(");")	 Nl      |)   'rule' put_actions_MEMBER(token(N))      (|	 GrammarClass -> cfg	 -- xxx	 indent	 Put("get_lexval();")	 Nl      ||	 indent	 Put("yycheck(")	 PutI(N)	 Put(");")	 Nl	 indent	 Put("yycursym = yylex();")	 Nl      |)   'rule' put_actions_MEMBER      (subphrase(option, Alternatives, Key, _, Coordinate))      indent      Put("switch (yyselect()) {")      Nl      put_actions_ALTERNATIVELIST(Alternatives)      indent      Put("default: ;")      Nl      indent      Put("}")      Nl   'rule' put_actions_MEMBER(subphrase(loop, Alternatives, Key, _, Coordinate))      UniqueLabel(-> L)      indent      Put("while (1) {")      Nl      indentation(+1)      indent      Put("switch (yyselect()) {")      Nl      put_actions_ALTERNATIVELIST(Alternatives)      indent      Put("default: goto yy")      PutI(L)      Put(";")      Nl      indent      Put("}")      Nl      indentation(-1)      indent      Put("}")      Nl      indent      Put("yy")      PutI(L)      Put(": ;")      Nl   'rule' put_actions_MEMBER      (subphrase(alternatives, Alternatives, Key, _, Coordinate))      indent      Put("switch (yyselect()) {")      Nl      put_actions_ALTERNATIVELIST(Alternatives)      indent      Put("default: printf(\"???\\n\"); exit(1);") -- xx      Nl      indent      Put("}")      Nl   'rule' put_actions_MEMBER(sem(Blk))      -- put_CodeBlock("{", Blk, "}")      put_CodeBlock("", Blk, "")'action' put_actions_ALTERNATIVELIST(ALTERNATIVELIST)   'rule' put_actions_ALTERNATIVELIST(list(H, T))      put_actions_ALTERNATIVE(H)      put_actions_ALTERNATIVELIST(T)   'rule' put_actions_ALTERNATIVELIST(nil)'action' put_actions_ALTERNATIVE(ALTERNATIVE)   'rule' put_actions_ALTERNATIVE   (alternative(Members, AlternativeKey, _, Coordinate))      indent      AlternativeKey'ClauseKey -> ClauseKey      ClauseKey'Number -> Number      Put("case ")      PutI(Number)      Put(": {")      Nl      -- AlternativeKey'RuleHandle -> RuleHandle      -- Put("  [") PutI(RuleHandle) Put("]")      -- AlternativeKey'ClauseKey -> ClauseKey      -- ClauseKey'Pos -> Pos      indentation(+1)      put_actions_MEMBERLIST(Members)      indent      Put("} break;")      Nl      indentation(-1)/* forward decls (C++)'action' handle_formal_params(FORMPARAMLIST)   'rule' handle_formal_params(list(H,T))      handle_formal_param(H)      [| where(T -> list) Put(", ") |]      handle_formal_params(T)   'rule' handle_formal_params(nil)'action' handle_formal_param(FORMPARAM)   'rule' handle_formal_param (param(Mode, Type, Name))      id_to_string(Type -> TStr)      Put(TStr)      Put(" ")      [|         where(Mode -> out)	 Put("*")      |]      id_to_string(Name -> NStr)      Put(NStr)*/---'action' handle_formal_params_1(FORMPARAMLIST)-- write formal parameter list-- check formal parameters fo uniqueness   'rule' handle_formal_params_1(list(H,T))      handle_formal_param_1(H)      where(H -> param(_,_, Name, _))      check_formal_param(Name, T)      [| where(T -> list) Put(", ") |]      handle_formal_params_1(T)   'rule' handle_formal_params_1(nil)'action' handle_formal_param_1(FORMPARAM)   'rule' handle_formal_param_1 (param(Mode, Type, Name, Pos))      id_to_string(Name -> NStr)      Put(NStr)'action' check_formal_param(IDENT, FORMPARAMLIST)   'rule' check_formal_param(Name1, list(param(_, _, Name2, Pos), Tl)):      [|	 eq(Name1, Name2)	 ErrorI("formal parameter '", Name1, "' declared more than once", Pos)      |]      check_formal_param(Name1, Tl)   'rule' check_formal_param(_, nil)---'action' handle_formal_params_2(FORMPARAMLIST)-- write declarations for formal parameters   'rule' handle_formal_params_2(list(H,T))      handle_formal_param_2(H)      handle_formal_params_2(T)   'rule' handle_formal_params_2(nil)'action' handle_formal_param_2(FORMPARAM)   'rule' handle_formal_param_2 (param(Mode, Type, Name, Pos))      id_to_string(Type -> TStr)      Put("   ")      Put(TStr)      Put(" ")      [|         where(Mode -> out)	 Put("*")      |]      id_to_string(Name -> NStr)      Put(NStr)      Put(";")      Nl      define_local_name(Mode, Type, Name)----- note: already checked when declaring locals'action' handle_actual_params(ACTPARAMLIST, FORMPARAMLIST)   'rule' handle_actual_params(list(H,T, _), list(H2,T2))      handle_actual_param(H, H2)      [| where(T -> list) Put(", ") |]      handle_actual_params(T, T2)   'rule' handle_actual_params(nil, nil)'action' handle_actual_param(ACTPARAM, FORMPARAM)   'rule' handle_actual_param (id(Id, _), param(FMode, FType, _, _))      defined_locally(Id -> AMode, _)      (|	 where(FMode -> out)         (|	    where(AMode -> out)	    -- is already *T	 ||	    Put("&")	 |)      ||	 (|	    where(AMode -> out)	    -- is *T, dereference	    Put("*")	 ||	    -- is already value	 |)      |)      id_to_string(Id -> Str)      Put(Str)------ xx assumption: there is one formal output parameter of type YYSTYPE'action' handle_token_params(ACTPARAMLIST, FORMPARAMLIST, INT)   'rule' handle_token_params(list(H,T, _), list(H2,T2), N)      handle_token_param(H, H2, N)      -- xx handle_token_params(T, T2, N+1)   'rule' handle_token_params(nil, _, _)'action' handle_token_param(ACTPARAM, FORMPARAM, INT)   'rule' handle_token_param (id(Id, _), param(FMode, FType, _, _), N)      defined_locally(Id -> AMode, _)      indent      (|	 where(FMode -> out)         [|	    where(AMode -> out)	    Put("*")	 |]      ||	 -- error xxx      |)      id_to_string(Id -> IdStr)      Put(IdStr)      Put(" = yylval;")      Nl----'var' LabelCount: INT'action' UniqueLabel(-> INT)   'rule' UniqueLabel(-> N)      LabelCount -> N      LabelCount <- N+1---'action' local_declarations (CLAUSEKEYS)'rule' local_declarations (CLAUSEKEYS)   local_declarations_CLAUSEKEYS(CLAUSEKEYS)'action' local_declarations_CLAUSEKEYS(CLAUSEKEYS)   'rule' local_declarations_CLAUSEKEYS(clausekeys(Keys, Key))      local_declarations_CLAUSEKEYS(Keys)      local_declarations_CLAUSEKEY(Key)   'rule' local_declarations_CLAUSEKEYS(nil)'action' local_declarations_CLAUSEKEY(CLAUSEKEY)   'rule' local_declarations_CLAUSEKEY(ClauseKey)      ClauseKey'GrammarRef -> members(Members)      local_declarations_sweep(Members)'sweep' local_declarations_sweep(ANY)   'rule' local_declarations_sweep(call(Id, ActParams, _, Pos))      HasMeaning(Id -> Meaning)      (|         where(Meaning -> nontermobj(_, _, FormalParams))         process_formal_and_actual_params(FormalParams, ActParams)      ||         where(Meaning -> tokenobj(_, FormalParams))	 process_token_param(ActParams)      |)'action' process_formal_and_actual_params(FORMPARAMLIST, ACTPARAMLIST)   'rule' process_formal_and_actual_params(list(FHd, FTl), list(AHd, ATl, Pos))      process_formal_and_actual(FHd, AHd)      process_formal_and_actual_params(FTl, ATl)   'rule' process_formal_and_actual_params(nil, nil(_))   'rule' process_formal_and_actual_params(nil, list(_, _, Pos))      Error("too many actual parameters", Pos)   'rule' process_formal_and_actual_params(list(_, _), nil(Pos))      Error("too few actual parameters", Pos)'action' process_formal_and_actual(FORMPARAM, ACTPARAM)   'rule' process_formal_and_actual   (param(FMode, FType, FName, _), id(AName, Pos))      (|         defined_locally(AName -> AMode, AType)	 [|	    ne(FType, AType)	    ErrorI	    ("'", AName, "' has inconsistent type", Pos)	 |]      ||	 define_local_name(none, FType, AName)	 Put("   ")	 id_to_string(FType -> FTypeStr)	 Put(FTypeStr)	 Put(" ")	 id_to_string(AName -> ANameStr)	 Put(ANameStr)	 Put(";")	 Nl      |)'action' process_token_param(ACTPARAMLIST)   'rule' process_token_param(list(id(AName, Pos), nil(_),_))      string_to_id("YYSTYPE" -> FType)      (|         defined_locally(AName -> AMode, AType)	 [|	    ne(FType, AType)	    ErrorI	    ("'", AName, "' has inconsistent type", Pos)	 |]      ||	 define_local_name(none, FType, AName)	 Put("   ")	 id_to_string(FType -> FTypeStr)	 Put(FTypeStr)	 Put(" ")	 id_to_string(AName -> ANameStr)	 Put(ANameStr)	 Put(";")	 Nl      |)   'rule' process_token_param(nil)   'rule' process_token_param(list(id(Name, Pos), list(id(Name2, Pos2),Tl,_),_))      Error("Too many parameters for token", Pos)'var' LocalNames: DEFLIST'type' DEFLIST   list(DEF, DEFLIST)   nil'type' DEF   def(MODE, Type: IDENT, Name: IDENT)'action' define_local_name (MODE, IDENT, IDENT)   'rule' define_local_name (Mode, Type, Name)      LocalNames -> L      LocalNames <- list(def(Mode, Type, Name), L)'condition' defined_locally(IDENT -> MODE, IDENT)   'rule' defined_locally(Name -> Mode, Type)      LocalNames -> L      defined_locally_h(L, Name -> Mode, Type)'condition' defined_locally_h(DEFLIST, IDENT -> MODE, IDENT)   'rule' defined_locally_h(list(def(M,T,N), Tail), Name -> Mode, Type)      (|	 eq(N, Name)	 where(M -> Mode)	 where(T -> Type)      ||	 defined_locally_h(Tail, Name -> Mode, Type)      |)---'action' put_CodeBlock(STRING, ACTIONBLOCK, STRING)   'rule' put_CodeBlock(Str1, action(BlkTxt, BlkPos), Str2)      Put("#line ")      POS_to_LineNumber(BlkPos -> N1)      PutI(N1)      GetSourceFileName(-> Name)      Put(" \"")      Put(Name)      Put("\"")      Nl      Put(Str1)      PutBlockText(BlkTxt)      Put(Str2)      Nl      GetOutputLineCount(-> N2)      Put("# line ")      PutI(N2+2)      Put(" \"yygrammar.c\"")      Nl   'rule' put_CodeBlock(_, none, _)'action' PutBlockText(STRING)'action' GetOutputLineCount(-> INT)---'action' GetSourceFileName(-> STRING)'action' POS_to_LineNumber (POS -> INT)'action' string_to_id (STRING -> IDENT)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -