Mercurial > ~dholland > hg > ag > index.cgi
view doc/misc/html/examples/dsl.html @ 0:13d2b8934445
Import AnaGram (near-)release tree into Mercurial.
author | David A. Holland |
---|---|
date | Sat, 22 Dec 2007 17:52:45 -0500 |
parents | |
children |
line wrap: on
line source
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"> <HTML> <HEAD> <TITLE>DOS Script Language</TITLE> </HEAD> <BODY BGCOLOR="#ffffff" BACKGROUND="tilbl6h.gif" TEXT="#000000" LINK="#0033CC" VLINK="#CC0033" ALINK="#CC0099"> <P> <IMG ALIGN="right" SRC="../images/agrsl6c.gif" ALT="AnaGram" WIDTH=124 HEIGHT=30 > <BR CLEAR="all"> Back to <A HREF="../index.html">Index</A> <P> <IMG ALIGN="bottom" SRC="../images/rbline6j.gif" ALT="----------------------" WIDTH=1010 HEIGHT=2 > <P> <H1>DOS Script Language </H1> <IMG ALIGN="bottom" SRC="../images/rbline6j.gif" ALT="----------------------" WIDTH=1010 HEIGHT=2 > <P> <H2>Introduction</H2> <P> DSL is a script language, written in AnaGram, which provides powerful extensions to the batch processing facilities available with DOS batch files. <P> DSL was built in large part by combining components from other grammars. Although the grammar for DOS command lines and for screen displays was written explicitly for DSL, just about everything else was borrowed from other grammars. <P> DSL has been tested using Borland C++, V4.52, and Watcom C++, V10.6. #ifdef statements have been used where necessary to support both compilers. V10.6 can be used to produce either 16 or 32 bit executables. If you use Watcom, be sure to specify a stack size of at least 16K bytes. <P> DSL cannot be used with Microsoft Visual C++, since MSVC V1.5 does not support templates and V4.x and subsequent releases do not support DOS. <P> <!-- not yet true DSL has been arranged so it will compile under Unix, but it will not run in any useful fashion. --> <P> DSL was written as part of the AnaGram 1.x installer; it is now obsolete but retains certain features of interest. <P> <H2> Features of DSL </H2> <UL> <LI> DOS command line interpreter with substitutable parameters, redirection and pipelines. </LI> <LI> Screen builder for interactive parameter specification. </LI> <LI> String and integer variables, expressions and comparisons </LI> <LI> DOS for statement. </LI> <LI> Nested if and while statements. </LI> </UL> <P> <H2> Screen Description </H2> The screen description syntax allows you to specify the size, location, and colors of windows plus two kinds of data entry fields: data fields and buttons. <P> A data field description consists of a prompt, an explanation, a variable name for the data, and a default value expression. The expression is evaluated for the default value of the data whenever the screen is refreshed. This means it can be modified as data entry is proceeding, based on fresh information. <P> A button description consists of a prompt, an explanation, and an action field. The action field consists of any sequence of DOS commands enclosed in brackets. Each command should be on a new line. <P> <H2> Variables and Constants </H2> DSL has three types of variables: undeclared, integer, and string variables. <P> Undeclared variables may be used in DOS commands and screen descriptions. They may appear on the left side of assignment statements. The names of undeclared variables are simple "literals", that is, sequences of characters drawn from the set "text char". If an undeclared variable does not have a value assigned to it, either by an assignment statement or by its use in a screen, it will be taken literally. <P> Integer and string variables must be declared. They may be used in expressions and comparisons. In particular they may be used in if statements and while statements. <P> DSL supports 32 bit integer arithmetic using essentially the expression logic in C with a slight modification for string comparison. Integer constants may be decimal, octal, hexadecimal or character constants, using the C conventions. <P> Beside simple "literals", DSL supports "string literals" which follow the rules for string literals in C, and parenthesized literals. Parenthesized literals are enclosed in parentheses and may contain any characters whatsoever, the only restriction being that any nested parentheses must balance. When a parenthesized literal is evaluated, the outer parentheses are stripped. <P> <H2> Theory of Operation </H2> DSL is a purely interpretive program. In some circumstances, statements and commands are executed as they are scanned. In other cases, where execution is to be delayed or is conditional, they are simply passed over on first scan and then copied. DSL then calls itself recursively to execute the copy when it is appropriate. <P> Note that if the parser you build from <tt>dsl.syn</tt> is called without any arguments, it looks for a script with the same name as the executable. Thus, to make an install program that picks up the install script without any arguments, you simply rename <tt>dsl.exe</tt> to <tt>install.exe</tt>. Then when you run it without any arguments it will run the <tt>install.dsl</tt> script. <P> DSL makes extensive use of a number of simple data structures defined in the <tt>oldclasslib</tt> directory of the AnaGram distribution. The most important of these are the string accumulators, the string dictionaries, and the stacks. <P> <P> The remainder of this document provides a brief overview of the principal data structures used by DSL and the most important nonterminal tokens in the DSL grammar. <P> <H2> Stacks </H2> <H4>as</H4> This is a stack of pointers to actions which have been identified in the parse. An action is a block of commands enclosed in braces {}. The action pointer records a pointer to the beginning of the action, as well as the line and column number where the action begins. The use of a stack allows nested actions. <H4>is</H4> This is a stack of integers. Its only use is for recording string concatenation sequences, where the integers stacked are the string dictionary indices of the items to be concatenated. <H4>ps</H4> This stack accumulates pointers to the parameter strings for a call to a DOS function. <P> <H2> Symbol Table </H2> Three data structures are used to gather and maintain symbol table information. The first is a string accumulator, sa, which is used for temporary storage for all strings that are recognized by the parser. The string dictionary, sd, is used to identify strings. The array st contains specific information about strings indexed in sd. <P> <H2> Nonterminal Tokens </H2> <H4> action text </H4> "action text" is any sequence of commands enclosed in balanced braces. action text may be used in most contexts where a string value is expected. In these situations, the enclosed commands are executed, the content of stdout is captured as a string, and is returned as the value of the action text. For example, {DIR} returns a string containing the file directory for the current directory. <P> <H4> action text head </H4> "action text head" is simply action text up to the terminating right brace. <P> <H4> assignment </H4> Normally, an identifier on the left, an expression on the right, the kind of expression depending on the identifier. Note that using the '@' operator you can modify characters inside a string. <P> <H4> built_in name </H4> Note that there are a number of arithmetic functions built into DSL. <P> <H4> button line </H4> A button line is a line on a screen display that controls the further execution of the script. The description of the button line requires a label, an explanation, and an action to be performed when the button is selected. <P> <H4> character constant </H4> Follows the same rules as in C. <P> <H4> command </H4> This is the syntax for a DOS command line, allowing redirected input and output and piped commands. <P> <H4> command sequence </H4> A command sequence is any sequence of statements and if statements that ends with a statement. <P> <H4> comment </H4> This is an ordinary C-style comment. <P> <H4> comment head </H4> The beginning of a comment. Normally everything but the terminating <CODE> */ </CODE>. If a nested comment is found, the rule "comment head, comment" should reduce to "comment head" if it is desired that comments nest. If this rule reduces to "comment", the terminating <CODE> */ </CODE> of the nested comment will serve to terminate the outer level comment as well, and comments will not nest. See the discussion in AnaGram\SBB.DOC or in Appendix D, <A href="sbb-doc.html">Syntactic Building Blocks</A>, in the AnaGram User's Guide. <P> <H4> conditional exp </H4> This is the standard C expression logic modified as follows: Integer arithmetic only; string comparison allowed; no auto-increment or auto-decrement operators. <P> <H4> declaration </H4> Three kinds of declarations: actions can be used like DOS commands. The definition lists substitutable arguments which can be supplied at execution time. <P> Variables which are declared to be strings or ints must satisfy the usual naming conventions of program variables in order to avoid confusion in the expression logic. <P> <H4> eol </H4> eol is a newline character, optionally preceded by a C++ style comment beginning with //. eol is not included in "ws" because it is used as a statement terminator. <P> <H4> execution block </H4> A sequence of DOS commands enclosed within braces. The difference between an execution block and "action text" is that the commands in an execution block are performed as they are encountered, while "action text" is saved up for later execution. <P> <H4> for statement </H4> Modeled on the for statement in the DOS batch language rather than on the for statement in C. <P> <H4> formula </H4> A sequence of "words", joined by concatenation operators ('#'). When the formula is evaluated, the words are identified in the string dictionary, and their values are concatenated. If a word has no entry in the dictionary its literal value is used. Formulas are used in the specification of the fields in a query line. <P> <H4> identifier </H4> A DOS command <P> <H4> if condition </H4> The keyword if and a conditional expression within parentheses. <P> <H4> if sequence </H4> An if sequence is any direct sequence of statements and if statements that ends with an if statement. The difference between an "if sequence" and a "command sequence" is that an else clause may follow the "if sequence". <P> <H4> if statement </H4> An "if condition" followed by "action text". Note that a simple statement is not allowed. <P> <H4> integer constant </H4> Follows the same rules as an integer constant in C, allowing decimal, octal and hex constants. <P> <H4> integer variable </H4> An variable that has been declared with an "int" statement. <P> <H4> literal </H4> A "literal" is any sequence of characters that does not include white space; parentheses, brackets, or braces; quotation marks or newline characters; redirection or pipe operators, or '#' or '='. Essentially, a "literal" is anything that would make sense on a DOS command line. <P> <H4> literals </H4> A sequence of instances of "literal" separated by white space. This sequence is used only in the definition of a named action. The first literal is the name of the action. Subsequent literals are the local names of the substituble parameters. <P> <H4> name </H4> Used for int and string variables. The conventional rules for variable names in programming language are used. <P> <H4> parameter string </H4> parameter string is essentially the same as "string", except that any of the concatenated strings may be action text, that is the result of executing a DOS command and capturing stdout. <P> <H4> parameter word </H4> parameter word is essentially the same as "word", except that it may also be action text, that is, the result of executing a DOS command and capturing stdout. <P> <H4> parameters </H4> The parameters for a DOS command <P> <H4> paren string </H4> A parenthesized string is any sequence of characters within parentheses, with the only restriction that any nested parentheses must balance. When evaluated, the outer set of parentheses is stripped. Parenthesized strings are for use in DOS command lines in those situations where the restrictions on "literal" are excessively onerous. <P> <H4> piped command </H4> A "piped command", here, is any DOS command, for which stdout must be captured and redirected. <P> <H4> primary exp </H4> These are the basic elements of expressions. Note that you may use the '@' operator to extract a character from a string. You need not use parentheses on the right if you use a simple index variable or integer constant. If you wish to use a more complex expression, you must use parentheses. <P> <H4> query line </H4> This is the description of a line on a screen into which the user is invited to enter some data. The description requires four elements: the variable into which the data is to be stored, the default value for the data, a prompt which identifies the data, and an explanation field which provides a fuller explanation of the data required. <P> After data has been entered for a particular query line, all elements of other query lines are reevaluated in case their defaults have been defined in terms of the data entered. <P> <H4> screen description </H4> A sequence of screen items enclosed in braces. A screen description is executed as it is read. If you wish to describe a screen for later use, incorporate it in an "action declaration". <P> A screen description requires a number of "screen items". These items consist of the title, the color specifications, the size and location of the window, and a number of query lines and button lines. <P> The layout of the screen is done automatically. <P> <H4> script file </H4> This is the grammar token. It describes the entire script file. <P> <H4> statement </H4> Statements include DOS commands plus declarations, assignment statements, control statements and screen descriptions. Note the repetition of the while statement. This stratagem allows a very simple implementation of looping logic. <P> <H4> string </H4> "string" is a concatenation of "word"s, using the concatenation operator, '#'. <P> <H4> string exp </H4> Syntactically the same as "string", except that the primitive elements are different. <P> <H4> string literal </H4> Follows exactly the same rules as string literals in C. <P> <H4> string primary </H4> Note that you may use '@' to extract a substring from a string. <P> <H4> string variable </H4> A variable that has been declared with a "string" declaration. <P> <H4> undeclared variable </H4> A variable that has not been declared, but has been defined only by its use. <P> <H4> while statement </H4> Like the C while statement except that the scope of the while statement must be contained within braces. The braces are mandatory. <P> <H4> word </H4> One or more "words" can be concatenated using the '#' operator to create a "string". The command identifer in a DOS command line is determine by evaluating such a string. The "formula" used for the default values in screens is also a sequence of one or more "words", joined by '#', with the difference that the actual evaluation of the string is deferred until the screen is displayed, and then is recalculated after each field is entered. <P> Note that "subscripts" are allowed. <P> <H4> ws </H4> ws (white space) consists of blanks, tabs and nested C-style comments. </P> <BR> <IMG ALIGN="bottom" SRC="../images/rbline6j.gif" ALT="----------------------" WIDTH=1010 HEIGHT=2 > <P> <IMG ALIGN="right" SRC="../images/pslrb6d.gif" ALT="Parsifal Software" WIDTH=181 HEIGHT=25> <BR CLEAR="right"> <P> Back to <A HREF="../index.html">Index</A> <P> <ADDRESS><FONT SIZE="-1"> AnaGram parser generator - examples<BR> DOS Script Language <BR> Copyright © 1993-1999, Parsifal Software. <BR> All Rights Reserved.<BR> </FONT></ADDRESS> </BODY> </HTML>