// syntax: syn3 import "synsh"; // // This module contains any tcsh-specific stuff written directly // in syn as opposed to synsh (which basically means any compile-time // logic as opposed to run-time logic). // int = synsh_type("int"); bool = synsh_type("bool"); string = synsh_type("string"); time = synsh_type("time"); duration = synsh_type("duration"); fileContents = synsh_type("fileContents"); url = synsh_type("url"); void = synsh_type("void"); defun synsh_array(type) synsh_type("arrayOf_"+$type's src); stringList = synsh_array(string); //------- These are invoked like variables but need to generate code: break = { code: line: "break"; }; continue = { code: line: "continue"; }; //------- Const initializers: macro synsh_intval { // println("INT CONST:", $val); src: $val; type: int; // code: line: %strcat("# Int const ", $val); }; macro synsh_strval { src: $val; type: string; // code: line: %strcat("# String const ", $val); }; //--------- Argv argv = %{ src=argv type%{ stringList } }; //---------------- Overall structure of a tcsh file: --------------------- synsh_block_once = 1; synsh_quote = %symstr(34); macro synsh_block { if $_'s code then { if synsh_block_once then { synsh_block_once = 0; println("---------------- Start File --------------------"); println("#!/bin/csh -f"); println(" "); println("# This script was automatically generated by Synsh."); println(" "); println("set _start=main_VOID"); println("set _params=()"); println("if ($#argv > 0) then"); %print(" if ("); %print(synsh_quote); %print("$argv[1]"); %print(synsh_quote); println(" == '-jump') then"); println(" shift argv"); println(" set _start=($argv[1])"); println(" shift argv"); println(" endif"); println("endif"); println("while ($#argv > 0)"); %print(" if ("); %print(synsh_quote); %print("$argv[1]"); %print(synsh_quote); println(" == '-param') then"); println(" shift argv"); println(" set _params=($_params:q $argv[1])"); println(" shift argv"); println(" else"); println(" break"); println(" endif"); println("end"); println("goto $_start"); println(" "); println("#-------"); println(" "); }; synsh_printlines(%($_'s code)); println(" "); println("#-------"); println(" "); }; };