Mercurial > ~dholland > hg > ag > index.cgi
view anagram/guisupport/helpdata.src @ 8:ec2b657edf13
Add explicit lint-comment-style fallthrough annotations.
GCC now assumes that if you don't have these you're making a mistake,
which is annoying.
XXX: This changeset updates the AG output files only (by hand) and is
XXX: abusive - rebuilding them will erase the change. However, I need
XXX: to get things to build before I can try to get AG to issue the
XXX: annotations itself, so this seems like a reasonable expedient.
author | David A. Holland |
---|---|
date | Mon, 30 May 2022 23:51:43 -0400 |
parents | 13d2b8934445 |
children |
line wrap: on
line source
Accept Action The accept action is one of the four actions of a traditional ©parsing engineª. The accept action is performed when the ©parserª has succeeded in identifying the goal, or ©grammar tokenª for the ©grammarª. When the parser executes the accept action, it sets the ©exit_flagª field in the ©parser control blockª to AG_SUCCESS_CODE and returns to the calling program. The accept action is thus the last action of the parsing engine and occurs only once for each successful execution of the parser. If the grammar token has a non-void value, you may obtain its value by calling the ©parser value functionª whose name is given by <parser name>_value, that is, by appending "_value" to the ©parser nameª. ## Parser Value Function, Return Value The value assigned to the ©grammar tokenª in your parser may be retrieved by calling the parser value function after the parser has finished. The name of this function is given by <©parser nameª>_value. The return type of the function is the type assigned to the grammar token. If you have set the ©reentrant parserª switch, the parser value function takes a pointer to the ©parser control blockª as its sole argument. Otherwise, it takes no arguments. The value function is not defined if the grammar token has type "void". ## AG_PLACEMENT_DELETE_REQUIRED When the ©wrapperª option is specified, the wrapper template class that AnaGram defines uses a "placement new" operator to construct the wrapper object on the ©parser value stackª. The MSVC++ 6.0 compiler requires, in this situation, that a corresponding "placement delete" operator be defined. Other C++ compilers, notably MSVC++ 5.0, generate an error message if they encounter the definition of a "placement delete" operator. Accordingly, AG_PLACEMENT_DELETE_REQUIRED is used to determine whther a "placement delete" operator should be defined. AG_PLACEMENT_DELETE_REQUIRED is defined to be 1 if you are using MSVC++ 6.0 or greater, 0 otherwise. You can override the automatic definition of AG_PLACEMENT_DELETE_REQUIRED by defining it in the ©C prologueª section of your grammar. Set it to a non-zero value to force the "placement delete" definition, zero to skip the definition. ## ag_tcv ag_tcv is an array AnaGram includes in your ©parserª. Your parser uses ag_tcv to translate external codes to the internal token numbers that AnaGram uses. It uses the actual input code to index the ag_tcv array to fetch a ©token numberª. The token number is then used to identify the input token. ## Allow macros "Allow macros" is a ©configuration switchª which defaults to on. When it is set, i.e., on, ©reduction procedureªs will be implemented as macros if they are sufficiently simple. This makes your ©parserª somewhat more compact but makes it somewhat more difficult to debug. It's a good idea to turn this switch off for debugging. ## Analyze Grammar The Analyze Grammar command will scan and analyze your ©syntax fileª, and create a number of tables summarizing your grammar. Analyze Grammar does not create any ©output filesª. To create a ©parserª, use the ©Build Parserª command. You would probably use Analyze Grammar, rather than Build Parser, during initial development of your ©grammarª. You can use ©File Traceª and ©Grammar Traceª as soon as you have analyzed your grammar. It is not necessary to build a parser first. ## Attribute Statement Attribute statements are used in ©configuration sectionsª of your ©syntax fileª to specify certain properties for ©tokenªs, ©character setªs, or other units of your grammar. The attribute statements available are: ©disregardª ©distinguish keywordsª ©enumª ©extend pcbª ©hiddenª ©leftª ©lexemeª ©nonassocª ©rename macroª ©reserve keywordsª ©rightª ©stickyª ©subgrammarª ©wrapperª ## Auto init Auto init is a ©configuration switchª which defaults to on. It controls the initialization of any ©parserª that it is not ©event drivenª. When it is set to on, your parser is automatically initialized every time it is called. This is the situation you will normally use. On occasion, however, it is desirable to call a parser several times without reinitializing it. In this case, you may set the auto init parameter to off and then call the ©initializerª yourself whenever it is appropriate. ## Auto resynch "Auto resynch" is a ©configuration switchª which defaults to off. You may use it to specify ©automatic resynchronizationª as an ©error recoveryª mechanism. Setting the "auto resynch" switch causes AnaGram to include an automatic ©resynchronizationª procedure in your ©parserª. The resynchronization procedure will be invoked when your parser encounters a ©syntax errorª and will skip over input until it finds input characters or ©tokensª consistent with its state at the time of the error. An alternate technique, ©error token resynchronizationª, uses an ©error tokenª which you include in your grammar. ## Automatic Resynchronization Automatic ©resynchronizationª is one of several ©error recoveryª options available as part of parsers built by AnaGram. You enable automatic resynchronization by setting the ©auto resynchª ©configuration switchª. If your parser includes automatic resynchronization it will incorporate a heuristic procedure which will skip over input tokens until it finds a token which makes sense with respect to one or another of the ©productionªs active at the time of the ©syntax errorª. The purpose of the resynchronization procedure is to provide a simple way for your parser to proceed in the event of syntax errors so that it can find more than one syntax error on a given pass. The resynchronization procedure uses a heuristic based on your own syntax. AnaGram itself uses this technique to resynchronize after syntax errors in its input. A disadvantage to using this resynchronization technique is that the resynchronization procedure turns off all ©reduction procedureªs. Because of the error, a number of reduction procedures, which normally would be executed, will be skipped. The parameters for any reduction procedures that might be called later would be suspect and could cause serious problems. It seems more prudent simply to shut them down. If you use the automatic resynchronization procedure, you must also specify an ©eof tokenª so that the synchronizer doesn't inadvertently skip over the end of file. An alternative technique for resynchronization is called ©error token resynchronizationª. ## Auxiliary Trace An Auxiliary Trace is a pre-built grammar trace which you may select from the ©Auxiliary Windowsª popup menu for most windows which display parser state information. The Auxiliary Trace provides a path to the state specified in the highlighted line of the primary window. When obtained from the Parser Stack pane of the ©File Traceª or ©Grammar Traceª, the Auxiliary Trace is simply a copy of the current status of these traces so you can explore your alternatives while still retaining the status of the original trace for reference. ## Auxiliary Windows From most AnaGram windows you can pop up an Auxiliary Windows menu by clicking the right mouse button or by pressing Shift F10. Auxiliary Windows may have Auxiliary Windows of their own. Windows with a cursor bar (highlighted line): The windows available in the Auxiliary Windows menu depend on the grammar elements identified by the cursor bar in the parent window. If the cursor bar identifies a ©parser stateª, there will be windows that describe the state. If the cursor bar identifies a ©grammar ruleª, there will be windows that describe the rule. If the cursor bar identifies a ©tokenª, there will be windows that describe the token. In the case of a ©marked ruleª, token windows will describe the marked token, if any. In some cases, specialized pre-built grammar traces such as the ©Conflict Traceª or ©Auxiliary Traceª are on the menu. Help windows: For Help windows, the Auxiliary Windows menu will show all the available links to other ©Help topicsª from this window. ©Using Helpª is always available. ## Backtrack If your ©parserª does not continue after encountering a ©syntax errorª, you can speed it up and make it a little smaller by turning off the backtrack ©configuration switchª. If backtrack is on, AnaGram configures your parser so that in case of syntax error it can undo any ©default reductionsª it might have made as a consequence of the erroneous input. The purpose of such an undo function is to identify the proper ©error frameª and to maximize the probability of being able to recover gracefully. ## Empty Recursion This warning message tells you that the recursive step of the specified ©recursive ruleª can be completely matched by ©zero lengthª tokens, i.e., by nothing at all. The result is potentially an infinite loop in the generated ©parserª. The specified rule is an expansion rule of the specified token. Because of the possibility of encountering an infinite loop while parsing, AnaGram turns off its ©keyword anomalyª analysis if empty recursion is found. The ©File Traceª function is also disabled for the same reason. The ©circular definitionª of a token has the same effect as an empty recursion, in that no additional input is required to match the recursive rule. ## Keyword Anomaly analysis aborted: empty recursion The ©keyword anomalyª analysis has been turned off, since the presence of ©recursive ruleªs with ©empty recursionª can cause infinite loops in the analysis. ## Keyword Anomaly analysis aborted: circular definition The ©keyword anomalyª analysis has been turned off, since the presence of a ©circular definitionª can cause infinite loops in the analysis. ## File Trace disabled: empty recursion Because of the presence of ©recursive ruleªs with ©empty recursionª in this grammar and the infinite loops that can ensue, the ©File Traceª function has been disabled. ## File Trace disabled: circular definition Because of the presence of a ©circular definitionª in this grammar and the infinite loops that can ensue, the ©File Traceª function has been disabled. ## Both Error Token Resynch and Auto Resynch Specified This ©warningª message indicates that your ©grammarª defines an ©error tokenª and also requests ©automatic resynchronizationª. AnaGram will ignore the request for automatic resynchronization and will provide ©error token resynchronizationª. If you named a token "error" but do not wish ©error token resynchronizationª, you can either rename "error", or, in a ©configuration sectionª, you may explicitly specify the error token to be something you don't otherwise use in your grammar: [ error token = not used ] ## Bottom Margin "Bottom margin" is an ©obsolete configuration parameterª. ## Bright Background "Bright background" is a ©configuration switchª which was used in the DOS version of AnaGram. It is no longer used, but is still recognized for the sake of upward compatibility with old ©configuration fileªs. ## Build Parser You use the Build Parser command to create a ©parserª based on your ©grammarª. The parser is a C file consisting of the ©embedded Cª (which may include C++) code in your ©syntax fileª, your ©reduction procedureªs, a number of tables derived from your grammar specification, and a ©parsing engineª customized to your requirements. If you only wish to investigate your grammar and do not wish to create ©output filesª, use the ©Analyze Grammarª command. ## Build <file name> This item on the ©Action Menuª is available when you have analyzed a ©grammarª but you have not yet built it. It builds the grammar without reloading the ©syntax fileª from the disk. ## Cannot Make Wrapper for Default Token Type This ©warningª message occurs when AnaGram finds a token type that has been previously defined as the ©default token typeª listed in a ©wrapperª statement. If a wrapper is needed for a particular type, you must specify the ©data typeª explicitly for each relevant ©tokenª. As a result, a wrapper class has not been created for the specified token type. ## Token with Wrapper cannot be Default Token Type This ©warningª message indicates that an attempt has been made to specify a class that has previously been listed in a ©wrapperª statement as the ©default token typeª. If a wrapper is needed for a particular type, you must specify the ©data typeª explicitly for each relevant ©tokenª. As a result, the default token type has not been set. ## Case Sensitive "Case sensitive" is a ©configuration switchª which defaults to on. When it is on, it instructs AnaGram to build a parser for which all input is case sensitive. When it is off, the AnaGram builds a parser which ignores case for all input. If the ©iso latin 1ª configuration switch is turned off, case conversion will be limited to characters in the normal ascii range. When it is on, case conversion will be done for all iso latin 1 characters. If you have other requirements for case conversion, you may provide your own definition in your ©embedded cª for the ©CONVERT_CASEª macro which is invoked to perform case conversion on input characters. Note that the value of an input token is unaffected by the case sensitive switch. When case sensitive is off, 'a' and 'A' will be treated as the same input token by the parser, but the ©token valueªs will nevertheless be different. ## C Prologue If you include a block of ©embedded Cª code at the very beginning of your syntax file, it is called the "C prologue". It will be copied to your ©parser fileª before any of the code generated by AnaGram. You can use the C prologue to ensure that copyright notices, #include directives, or type definitions, for example, occur at the very beginning of your parser file. If you specify a C or C++ type of your own definition, you must provide a definition in the C prologue. ## CHANGE_REDUCTION CHANGE_REDUCTION(t) is a macro which AnaGram defines in your ©parser fileª if your ©parserª uses ©semantically determined productionsª. In your ©reduction procedureª, when you need to change the ©reduction tokenª you can easily do so by calling CHANGE_REDUCTION with the name of the desired token as the argument. If the token name has embedded spaces, replace the embedded spaces with underline characters. ## Character Constant You may represent single characters in your ©grammarª by using character constants. The rules for character constants are the same as in C. The escape sequences are as follows: \a alert (bell) character \b backspace \f formfeed \n newline \r carriage return \t horizontal tab \v vertical tab \\ backslash \? question mark \' single quote \" double quote \ooo octal number \xhh hexadecimal number AnaGram treats a single character as a ©character setª which contains only the specified character. Therefore you can use a character constant in a ©set expressionª. ## Character Map The Character Map table shows you the mapping of input characters to ©token numbersª. The ©ag_tcvª table in your parser is based on the information in this table. The fields in this table are: character code display character, if any (what Windows displays for this code) ©partition set numberª ©token numberª ©token representationª The display character will be what Windows displays for the character code in the Data Tables font you have chosen. ## Character Range A "character range" is a simple way to specify a ©character setª. There are two ways to represent a character range in an AnaGram ©syntax fileª. The first way is like a ©character constantª: 'a-z'. The second way allows somewhat greater freedom: 'a'..'z' 'a'..255 ^Z..037 -1..0xff Here you use two arbitrary ©character representationsª separated by two dots. If the two characters are out of order, AnaGram will reverse the order, but will give you a ©warningª. More complex ©character setsª may be specified by using ©unionª, ©differenceª, ©intersectionª, or ©complementª operators. ## Character Representation In an AnaGram ©syntax fileª you may represent a character literally with a ©character constantª or numerically using decimal, octal or hexadecimal representations following the conventions for C. Thus 'A', 65, 0101, and 0x41 all represent the same character. Control characters can be represented using the '^' character and either an upper or lower case letter. Thus ^j and ^J are acceptable representations of the ascii newline code. The rules for character constants are identical to those in C, and the same escape sequences are recognized. ## Character Set In AnaGram grammars you can conveniently specify whole sets of characters at a time. This avoids needless repetition and complexity. Sets of characters may be defined in an AnaGram ©syntax fileª in any of a number of ways. A single character is taken to represent a character set consisting of a single element. (See ©character representationª.) You can also specify a set consisting of a range of characters (see ©character rangeª) and perform the familiar set operations, union, intersection, difference and complement. All the sets you define in your syntax file are summarized in the ©Character Setsª window. The ©unionª of two character sets, represented by a '+', contains all characters that are in one or another of the two sets. Thus, 'A-Z' + 'a-z' represents the set of all upper and lower case letters. The ©intersectionª of two character sets, represented by a '&', contains all characters that are in both sets. Thus, suppose you have the ©definitionsª letter = 'A-Z' + 'a-z' hex digit = '0-9' + 'A-F' + 'a-f' Then (letter & hex digit) contains precisely upper and lower case a to f. The ©differenceª of two character sets, represented by a '-', contains all characters that are in the first set but not in the second set. Thus, using the same definitions as above, (letter - hex digit) contains precisely upper and lower case g to z. The ©complementª of a character set, represented by a preceding '~', represents all characters in the ©character universeª which are not in the given set. Suppose you have defined a set, ©eofª, which consists of the characters which represent end of file. Then, in your grammar where you wish to accept an arbitrary character, what you really want is anything but an end of file character. You can define it thus: anything = ~eof ## Character Sets This window lists all of the distinct ©character setªs which you defined, implicitly or explicitly, in your ©grammarª. Each line in the table describes one such set. The description takes the form of the internal set number and the defining ©expressionª. The ©Auxiliary Windowsª menu will allow you to see the ©Partition Setsª which cover the character set, and the ©Set Elementsª which it comprises, as well as the ©Token Usageª. ## Character Universe, Universe The character universe, or set of all expected input characters to your parser, is defined as all characters in the range given by a particular lower bound and a particular upper bound, as described below. The character universe is used for two things in AnaGram. The first use is for calculating the ©complementª of a character set. The second use is in the input processing of your parser. Input characters will be used to index a ©token conversionª table to convert character codes to token numbers. The length of this table will be given by the size of the character universe. If you have set the ©test rangeª ©configuration switchª you parser will verify that the input character is within the range of the conversion table. Otherwise, the character code will not be checked for validity. In this case, an out-of-range character will lead to undefined behavior. If you have not used any characters with negative codes in your grammar, the lower bound is zero. Otherwise, it is the most negative such character. If the highest character code you have used is less than or equal to 255, the upper bound will be 255. If you have used a character code greater than 255, the upper bound will be the largest such code which appears in your syntax file. ## Characteristic Rule Each ©parser stateª is characterized by a particular set of ©grammar rulesª, and for each such rule, a marked token which is the next ©tokenª expected. The combination of a grammar rule and its marked token is often called a ©marked ruleª. A marked rule which characterizes a state is called a "characteristic rule". In the course of doing ©grammar analysisª, AnaGram determines the characteristic rules for each ©parser stateª. After analyzing your grammar, you may inspect the ©State Definition Tableª to see the characteristic rules for any state in your parser. ## Characteristic Token Every state in a ©parserª, except state 0, can be characterized by the one, unique ©tokenª which causes a jump to that state. That token is called the ©characteristic tokenª of the state, because to get to that ©parser stateª you must have just seen precisely that token in the input. Note that several states could have the same characteristic token. When you have a list of states, such as is given by the ©parser state stackª, it is equivalent to a list of characteristic tokens. This list of tokens is the list of tokens that have been recognized so far by the parser. ## Circular Definition If the ©expansion ruleªs for a ©tokenª contain a ©grammar ruleª that consists only of the token itself, the definition of the token is circular. A circular definition is an extreme case of ©empty recursionª. As in cases of empty recursion, the generated parser may contain infinite loops. When such a condition is detected, therefore, ©keyword anomalyª analysis the ©File Traceª option are disabled. ## column "column" is an integer field in your ©parser control blockª used for keeping track of the column number of the current character in your input. Line and column numbers are tracked only if the ©lines and columnsª ©configuration switchª has been set. ## Command Line If you provide the name of a syntax file on the command line when you start AnaGram, it will open the file and run either ©Analyze Grammarª or ©Build Parserª depending on the setting of the ©Autobuildª switch. ## Command Line Version, agcl.exe The command line version of AnaGram, agcl.exe, can be used in make files. It takes the name of a single syntax file on the command line. Error and ©warningª messages are written to stdout. Normally you would only use the command line version once you have finished developing your ©parserª and are integrating it with the rest of your program. The command line version of AnaGram is not included with trial copies. ## Comment You may incorporate comments in your syntax file using either of two conventions. The first is the normal C convention for comments which begin with "/*" and end with "*/". Such comments may be of arbitrary length. By setting or resetting the ©nest commentsª switch, you may control whether they may be nested or not. The second convention for comments is the C++ comment convention. In this case the comment begins with "//" and ends with a newline. When writing a ©grammarª, you may wish to allow a user to comment his input freely without your having to explicitly allow for comments in your grammar. You may accomplish this by using the ©disregardª statement. ## Compile Command "Compile command" is a ©configuration parameterª which takes a string value. This parameter was used in the DOS version of AnaGram, but is ignored in the Windows version. ## Complement In set theory, the complement of a set, S, is the set of all elements of the ©universeª which are not members of the set S. In AnaGram, the complement operator for ©character setsª is given by '~' and has higher precedence than ©differenceª, ©intersectionª, or ©unionª. In AnaGram, the most useful complement is that of the end of file character set. For ordinary ascii files it is often convenient to read the entire file into memory, append a zero byte to the end, and define the end of file set thus: eof = 0 + ^Z. Then, ~©eofª represents all legitimate input characters. You can then use set differences to specify certain useful sets without tedious enumeration. For example, a comment that is to be terminated by the end of line then consists of characters from the set comment char = ~'\n' & ~eof This set could also be written comment char = ~('\n' + eof) ## Completed Rule A "completed rule" is a ©characteristic ruleª which has no ©marked tokenª. In other words, it has been completely matched and will be reduced by the next input. If there is more than one completed rule in a state, the decision as to which to reduce is made based on the next input token. If there is only one completed rule in a state, it will be reduced by default unless the ©default reductionsª switch has been reset, i.e., turned off. ## Configuration File If it can find them, AnaGram reads two configuration files to set up ©configuration parameterªs. At program initialization, it will first attempt to read a configuration file in the directory that contains the AnaGram executable file you are running. Then it will read a configuration file in your working directory. Both files should have the name "AnaGram.cfg" if they exist. Neither is necessary. If a parameter is specified in both files, the specification in the file from the working directory takes precedence. The effect of this two stage process is to allow you to set your standard preferences in the principal directory, with specific overrides in your working directories. The values for configuration parameters in ©syntax filesª override those read from configuration files. AnaGram does not save configuration parameters in the Windows registry, nor does it provide any mechanism for setting or changing the values of configuration parameters within AnaGram itself. ## Configuration Parameter Configuration parameters may be specified either in ©configuration filesª or in your ©syntax fileª. In your syntax files, configuration parameters are specified, one per line, in a ©configuration sectionª. AnaGram ignores case when identifying a configuration parameter, so that "ALLOW MACROS", "Allow Macros", and "allow macros" are all equivalent forms. There may be any number of configuration sections in a ©syntax fileª. Any parameter may be specified any number of times. Since AnaGram maintains only one value in storage for these parameters, whenever it refers to one it will see the most recently specified value. Every configuration parameter has a default value which has been chosen to correspond to a standard if it exists, customary usage if such can be determined, or otherwise to the most likely usage. Before executing an Analyze Grammar or Build Parser command, AnaGram resets configuration parameters to their initial values, as determined by the built in defaults and the configuration files read at program initialization. The ©Configuration Parameters Windowª shows the current settings of all of the configuration parameters. When this window is active you may press ©F1ª or click with the ©help cursorª to pop up a help window describing the parameter under the cursor bar. There are several varieties of configuration parameters. Some simply set or reset a condition. These need simply be stated to set the condition or negated with the tilde (~) to reset the condition. Thus [ nest comments ] causes AnaGram to allow nested comments, and [ ~nest comments ] causes AnaGram to disallow nested comments. If you prefer you may explicitly specify a switch value as on or off: [ nest comments = on] A second kind of configuration parameter takes a value which is the name of a token. Thus [ grammar token = c grammar] specifies that the token, c grammar, is the ©grammar tokenª which is to be analyzed. A third variety of configuration parameter takes a value which is a C data type. Thus [ default token type = unsigned char *] signifies that the ©semantic valueª of a token, unless otherwise specified is a pointer to an unsigned char. A fourth variety of configuration parameter takes a string value to set some ascii string used by AnaGram. Thus [ header file name = "widget.h" ] signifies that the header file created by AnaGram should be called "widget.h". In string-valued parameters used to specify the names of output files or the name of your parser, you may use the '#' character to indicate the name of your syntax file: When the string is actually used, AnaGram will substitute the syntax file name for the '#'. In string-valued parameters used to specify the names of functions or variables that AnaGram generates, you may use '$' to specify the name of your parser. When the string is actually used, AnaGram will substitute the name of your parser for the '$'. In the "©enum constant nameª" configuration parameter you may use '%' to specify where a token name is to be substituted. The final variety of configuration parameter takes a numeric value. The value may be decimal, octal or hexadecimal, following the C conventions, and may have an optional sign. Thus [parser stack size = 50] tells AnaGram to allocate space for at least fifty stack entries when it creates your parser. ## Configuration Parameters Window The Configuration Parameters window lists the ©configuration parameterªs AnaGram accepts with their current values, as set by the ©configuration filesª it has read and by the most recent ©syntax fileª it has analyzed. Configuration parameters cannot be changed from within AnaGram. ## Configuration Section A configuration section is one of the main divisions of your ©syntax fileª. It begins with a left square bracket on a fresh line. It then contains definitions of ©configuration parameterªs, ©configuration switchª settings and ©attribute statementªs. These specifications must each start on a new line. The configuration section is closed with a right bracket. Any further component of your syntax file, other than a ©commentª, must start on a fresh line. There can be any number of configuration sections in a syntax file. ## Configuration Switch A configuration switch is a ©configuration parameterª which can take on only the two values true and false, or on and off. You set a configuration switch, or turn it on, by simply naming it in your ©configuration fileª or in a ©configuration sectionª of your ©syntax fileª. You turn it off, or "reset" it, by use of the tilde: "~nest comments", for example, resets, or turns off, the ©nest commentsª switch. If you prefer, you may assign the value "on" to set the switch, or "off" to reset it. For example: nest comments = on ## Conflict "Conflicts" arise during the ©grammar analysisª when AnaGram cannot determine how to treat a given input token. There are two sorts of conflicts: ©shift-reduce conflictsª and ©reduce-reduce conflictsª. Conflicts may arise either because the grammar is inherently ambiguous, or simply because the grammar analyzer cannot look far enough ahead to resolve the conflict. In the latter case, it is often possible to rewrite the grammar in such a way as to eliminate the conflict. In particular, ©null productionsª are a common source of conflicts. When AnaGram analyzes your grammar, it lists all unresolved conflicts in the ©Conflictsª window. A number of ©Auxiliary Windowsª available from the Conflicts window provide help in identifying the source of the conflict. There are a number of ways to deal with conflicts. If you understand the conflict well, you may simply choose to ignore it. When AnaGram encounters a shift-reduce conflict while building parse tables it resolves it by choosing the ©shift actionª. When AnaGram encounters a reduce-reduce conflict while building parse tables, it resolves it by selecting the ©grammar ruleª which occurred first in the grammar. A second way to deal with conflicts is to set ©operator precedenceª parameters. If you set these parameters, AnaGram will use them preferentially to resolve conflicts. Any conflicts so resolved will be listed in the ©Resolved Conflictsª window. A third way to resolve a conflict is to declare some tokens as ©stickyª. This is particularly useful for ©productionªs whose sole purpose is to skip over uninteresting input. A fourth way to resolve conflicts is to declare a token to be a ©subgrammarª. When you do this, AnaGram does not look beyond the definition of the subgrammar token itself for reducing tokens. This is not a particularly selective way to resolve conflicts and should be used only when the subgrammar token is naturally defined only by internal criteria. The tokens identified by lexical scanners are prime examples of this genre. The fifth way to deal with conflicts is to rewrite the grammar to eliminate them. Many people prefer this approach since it yields the highest level of confidence in the resulting program. Please refer to the AnaGram User's Guide for more information about dealing with conflicts. ## Conflicts If there are ©conflictªs in your grammar which are not resolved by ©precedence rulesª, they will be listed in the Conflicts window. The Conflicts window will also be listed in the ©Browse Menuª. Conflicts which have been resolved by ©precedence rulesª are listed in the ©Resolved Conflictsª window. The Conflicts window lists the conflicts, or ambiguities, which AnaGram found in your grammar. The table identifies the ©parser statesª in which it found conflicts, the ©conflict tokenªs for which it had more than one option, and the ©marked rulesª for each such option. If one of the rules for a particular conflict has a ©marked tokenª, the conflict is a ©shift-reduce conflictª. The marked token is the token to be shifted. If none of the rules has a marked token the conflict is a ©reduce-reduce conflictª. AnaGram provides a number of ©Auxiliary Windowsª to help you find and fix the source of the conflict. The ©Conflict Traceª window is a pre-built ©Grammar Traceª window which shows you one of perhaps many ways to encounter the conflict. The ©Reduction Traceª window shows the result of reducing a particular ambiguous rule. In addition, the ©Rule Derivationª and ©Token Derivationª windows show you why the conflict token is a ©reducing tokenª. They are particularly useful for shift-reduce conflicts. The ©Expansion Chainª window is helpful for understanding reduce-reduce conflicts. Other Auxiliary Windows which are often useful are the ©State Definitionª window, the ©Reduction Statesª window, and the ©Problem Statesª window. Please refer to the AnaGram User's Guide for more information on how to deal with conflicts. ## Conflicts Resolved by Precedence Rules This ©warningª message indicates that AnaGram has resolved conflicts in your grammar by using ©precedence rulesª: guidelines you supplied either by explicit ©precedence declarationsª, by using a ©stickyª statement or ©distinguish lexemesª statement, or implicitly by using a ©disregardª statement. These conflicts are listed in the ©Resolved Conflictsª window, and are not listed in the ©Conflictsª window. ## Conflict Token In any given ©conflictª, there is a ©tokenª for which an unambiguous ©parser actionª cannot be determined. This token is called the "conflict token". ## Conflict Trace The Conflict Trace is a ready-made ©Grammar Traceª which shows you one of perhaps many ways to get to the state which has the ©conflictª selected by the cursor bar. The Conflict Trace window is an option in the ©Auxiliary Windowsª menu for the ©Conflictsª window and the ©Resolved Conflictsª window. ## Const Data The const data ©configuration switchª controls the use of CONST qualifiers in generated code. If the switch is set, all fixed data arrays in the ©parser fileª will be qualified as CONST, unless the ©old styleª switch is set. The default setting is ON. Other configuration switches which control declaration qualifiers in the parser file are ©near functionsª and ©far tablesª. ## CONTEXT "CONTEXT" is a macro which AnaGram defines for you if you have defined a ©context typeª. It provides access to the top value of the ©context stackª. Your ©GET_CONTEXTª macro may store the current context by assigning a value to CONTEXT. Suppose your parser uses ©pointer inputª, and you wish to know the value of the ©pointerª for every production. You could define GET_CONTEXT thus: #define GET_CONTEXT CONTEXT = PCB.pointer In ©reduction procedureªs, you may use the CONTEXT macro to find the context for the rule you are reducing, that is to say, the value the context variables had when the first token in the rule was encountered. ## Context Stack It is often convenient, when writing ©reduction procedureªs, to know the actual context of the ©grammar ruleª your procedure is reducing. To do this you need to know the values that certain variables, such as stack pointers, or input pointers, in your program had at various stages as your parser matched the rule. You can accomplish this by maintaining a context stack. If you wish, AnaGram will keep track, on a stack, of any context variables you wish. To do so, define a structure which can hold all the values you need to stack. Use the ©context typeª ©configuration parameterª to tell AnaGram how to declare the stack. Then define the ©GET_CONTEXTª macro to gather the appropriate values and store them on the stack. The ©CONTEXTª macro evaluates to the proper location into which the GET_CONTEXT macro should store the context value. AnaGram will invoke the GET_CONTEXT macro whenever necessary to make sure the right values are stacked. In a reduction procedure, you can then use the macro ©RULE_CONTEXTª to find the value of the context structure as of the beginning of each token in the rule you are reducing. If your parser is ©event drivenª, store the context of the input token in PCB.input_context. The default version of GET_CONTEXT will stack the context as appropriate. If your parser should encounter an error, you may use ©ERROR_CONTEXTª to determine the values of the context variables at the beginning of the aborted grammar rule. ## context type "Context type" is a ©configuration parameterª whose value is a C type name, possibly as defined by a typedef statement. By default, "context type" is undefined. If you define it, AnaGram will set up a ©context stackª in your ©parser control blockª so you can track the context of ©productionªs. Each time your parser pushes values onto the state stack and value stack it will invoke the ©GET_CONTEXTª macro to store the current context on the context stack. The macro ©CONTEXTª names the current stack location. In your GET_CONTEXT macro you can use it as the destination for the current context. In a ©reduction procedureª, CONTEXT names the context as of the beginning of the production. Two other macros are available to inspect the values of the context stack. In a reduction procedure, you may use ©RULE_CONTEXTª[k] to determine the value of the context variable as it was as of the (k+1)th token in the rule. In particular, RULE_CONTEXT[0] is the value the context variable had when the first token in the rule was seen. If you enable the ©error frameª ©configuration switchª, you may use ©ERROR_CONTEXTª to determine the context of the production your parser was trying to identify at the time of the error. ## CONVERT_CASE CONVERT_CASE is a user definable macro which AnaGram invokes to convert the case of input characters when the ©case sensitiveª switch has been turned off. If you do not define the macro yourself, AnaGram will provide a macro which will convert case correctly for characters in the ASCII character range and also for ©ISO latin 1ª characters if the corresponding ©configuration switchª is on. ## Coverage File Name If you have set the ©rule coverageª ©configuration switchª to include coverage analysis in your parser, AnaGram uses the value of the coverage file name ©configuration parameterª to find the results of your testing. The value of the parameter is a string. The default value is "#.nrc", where '#' represents the name of your syntax file. ## cs cs is a field in a ©parser control blockª which contains your ©context stackª. cs will be defined only if you have defined the ©configuration parameterª ©context typeª. ## Current Grammar The Current Grammar is the ©grammarª you presently have loaded. Its name is displayed on the title bar of each AnaGram window. A status field at the right center of the ©Control Panelª indicates the state of processing that has been carried out on the grammar. "Loaded" means that the ©syntax fileª has been read into memory, but that syntax errors have been found. "Parsed" means that AnaGram has tried to analyze the grammar, but got into some kind of difficulty and did not complete the job. The explanation should be apparent from the messages in the ©Warningsª window. "Analyzed" means that a ©grammar analysisª has been completed, but no ©output filesª have been written. "Built" means that an analysis has been completed and output files have been written. ## Data Type The ©tokensª in your ©parserª usually have ©semantic valuesª. The data types for these values will be determined by the ©default input typeª and ©default token typeª ©configuration parameterªs unless you explicitly provide ©token declarationsª in your grammar. You may also define the data type for any ©nonterminalª token by preceding the token name with an ordinary C cast when you write a production. For example: (int) integer -> '0-9':d =d-'0'; -> integer:n, '0-9':d =10*n + d - '0'; The data type may be any simple C or C++ data type, with arbitrary indirection and qualification. You may also use any type you have defined by means of typedef, struct or class definitions. Template classes may also be used. If you specify a type of your own definition, you must provide a definition in the ©C prologueª at the beginning of your ©syntax fileª. A token may have the type "void" if its value has no interest for the parser. Since your parser will not stack a value for a void token, your parser may run somewhat faster when tokens are declared as void. ## Declare pcb "Declare pcb" is a ©configuration switchª that defaults to on. If this switch is set when you invoke the ©Build Parserª command, AnaGram will automatically declare a ©parser control blockª for you, at the beginning of your parser file. If you have used data types that you define yourself, the typedef statements need to precede the parser control block declaration. In this case, you should turn "declare pcb" off and declare it yourself. For more information, see the AnaGram User's Guide. ## Default Input Type The default input type is a ©configuration parameterª which determines the ©data typeª for the ©semantic valueªs of ©terminal tokensª if they are not explicitly declared. Normally, you would explicitly declare terminal tokens only when you have set the ©input valuesª ©configuration switchª. If you do not set the default input type, it will default to "int". The default data type for the values of ©nonterminal tokensª is given by the ©default token typeª configuration parameter. ## Default Reduction "Default reductions" is a ©configuration switchª which defaults to on. A "default reduction" is a ©parser actionª which may be used in your parser in any state which has precisely one ©completed ruleª. If a given ©parser stateª has, among its ©characteristic rulesª, exactly one completed rule, it is usually faster to reduce it on any input than to check specifically for correct input before reducing it. The only time this default reduction causes trouble is in the event of a ©syntax errorª. In this situation you may get an erroneous reduction. Normally when you are parsing a file, this is inconsequential because you are not going to continue semantic action in the presence of error. But, if you are using your parser to handle real-time interactive input, you have to be able to continue semantic processing after notifying your user that he has entered erroneous input. In this case you would want default reductions to have been turned off so that ©productionªs are reduced only when there is correct input. ## Default reduction value If a ©grammar ruleª does not have a ©reduction procedureª the ©semantic valueª of the first token in the rule will be taken as the semantic value of the token on the left hand side. If these tokens do not have the same ©data typeª a ©warningª will be given. ## Default Token Type "Default token type" is a ©configuration parameterª which determines the ©data typeª for the ©semantic valueª of a ©nonterminal tokenª if no other type is explicitly specified. It defaults to void. Therefore, if any ©reduction procedureª returns a value, you must either explicitly set the type of the ©reduction tokenª or you must set default token type to an appropriate value. The default token type cannot have a ©wrapperª class defined. The default data type for the value of a ©terminal tokenª is given by the ©default input typeª configuration parameter. ## Definition, Definition Statement AnaGram syntax files may contain definition statements which assign new names to ©character setsª, ©virtual productionsª, ©keyword stringsª, ©immediate actionsª, or ©tokensª. Definitions have the form name = <character set> name = <virtual production> name = <keyword string> name = <immediate action> name = <token name> For example, letter = 'a-z' + 'A-Z' statement list = statement?... include = "include" The symbols thus defined may be used anywhere the expression on the right hand side might be used. Such definitions, in and of themselves, do not define tokens. Tokens are defined only by their usage in productions. ## DELETE_WRAPPERS If your parser uses ©wrapperªs and exits with an error condition, there may be objects remaining on the ©parser value stackª. The DELETE_WRAPPERS macro can be used to delete any remaining objects on the stack. If you have enabled ©auto resynchª, DELETE_WRAPPERS will be invoked automatically. ## Diagnose Errors "Diagnose errors" is a ©configuration switchª which defaults to on. When this switch is on, AnaGram includes a function, ag_diagnose(), in your parser which provides simple syntax error disgnoses. When your parser encounters a syntax error, this function will be called immediately prior to the invocation of the ©SYNTAX_ERRORª macro. A pointer to the message will be stored in the ©error_messageª field of the ©parser control blockª. If you wish to implement your own ©error diagnosisª, you should turn this switch off, and include a call to your own diagnostic procedure in your SYNTAX_ERROR macro. ag_diagnose() provides three possible error messages, governed by three macros: ©MISSING_FORMATª, ©UNEXPECTED_FORMATª, and ©UNNAMED_TOKENª. You may override the definitions of these macros with your own definitions if you wish to provide diagnostics in another language If you have set the ©error frameª switch it will also set the ©error_frame_tokenª field. The "error_frame_token" is the non-terminal token which the parser was trying to complete when the error was encountered. When the "diagnose errors" switch is set, AnaGram also includes the a ©token namesª table in the parser which contains the ascii names of the tokens in the grammar, including entries for character constants and keywords. Use the ©token names onlyª switch to limit the table to explicitly named tokens only. ## MISSING_FORMAT MISSING_FORMAT is a macro that is used by the error diagnositic function created by the ©diagnose errorsª switch. If you do not define it in your parser, AnaGram will define it thus: #define MISSING_FORMAT "Missing %s" This format is used when the diagnostic function can identify a unique terminal or nonterminal token that would satisfy the syntactic rules and is named in the ©token namesª table. ## UNEXPECTED_FORMAT UNEXPECTED_FORMAT is a macro that is used by the error diagnositic function created by the ©diagnose errorsª switch. If you do not define it in your parser, AnaGram will define it thus: #define UNEXPECTED_FORMAT "Unexpected %s" This format is used when the diagnostic function cannot identify a named, unique terminal or nonterminal token that would satisfy the syntactic rules and finds an incorrect token, the name of which can be found in the ©token namesª table. ## UNNAMED_TOKEN UNNAMED_TOKEN is a macro that is used by the error diagnositic function created by the ©diagnose errorsª switch. If you do not define it in your parser, AnaGram will define it thus: #define UNNAMED_TOKEN "input" This macro is used as argument for the ©UNEXPECTED_FORMATª macro when the actual, erroneous input cannot be identified. ## Difference In set theory, the difference of two sets, A and B, is defined to be the set of all elements of A that are not elements of B. In an AnaGram ©syntax fileª, you represent the difference of two ©character setsª by using the '-' operator. Thus the difference of A and B is A - B. The difference operator is ©left associativeª. ## Disregard The purpose of the "disregard" statement is to skip over uninteresting ©white spaceª and comments in your input file. It allows you to specify a token that should be passed over in the input to your parser. The statement takes the form: disregard ws where "ws" is a token name or character set. Disregard statements, like other ©attribute statementªs, may be placed in any ©configuration sectionª. You may have more than one disregard statement in your ©grammarª. If you do, AnaGram will create a shell production. For example, suppose you write: [ disregard alpha disregard beta ] AnaGram will proceed as though you had written: gamma -> alpha | beta [ disregard gamma ] It frequently happens that you wish your ©parserª to disregard blanks or comments, except that ©white spaceª within names, numbers, strings, and other elementary constructs is subject to special rules and thus should not be disregarded blindly. In this case, you can use the "©lexemeª" statement to declare these constructs off limits for the disregard statement. Within these constructs, the disregard statement will be inoperative and the admissibility of white space is determined solely by the productions which define these constructs. Outside those productions which define lexemes, you should not generally use a token which is supposed to be disregarded. If you do, your grammar will have ©conflictªs, since the token could satisfy both the explicit usage, as well as the implicit rules set up by the disregard statement. Such conflicts, however, are resolved automatically in favor of your explicit use of the token. The conflicts will appear in the ©Resolved Conflictsª window. If you have "open ended" lexemes in your grammar such as variable names or numeric constants, your grammar will detect a conflict if one of these lexemes may follow another such lexeme immediately. To deal with these conflicts, you should turn on the "©Distinguish Lexemesª" configuration switch. It will cause white space to be required as a separator between the lexemes. In order to implement the "disregard" statement AnaGram will redefine some tokens in your grammar. For example, '+' may be redefined to consist of a simple plus sign followed by optional white space: '+' -> '+'%, white space?... The ©percent signª is used to indicate the original, simple plus without the optional white space attached. You will probably notice the percent sign appearing in some windows and traces. ## distinguish keywords "distinguish keywords" is an ©attribute statementª which you may include in a ©configuration sectionª. It is used to tell AnaGram how to distinguish ©keywordªs from similar sequences of characters in your input stream. For example, you may want your parser to recognize "int" as a keyword when it appears in the following context: int x; but not when in appears in the middle of such words as "integral" and "intolerant". The operand of "distinguish keywords" is a list of character set ©expressionªs separated by commas and enclosed in braces ({ }). Once AnaGram has read your entire syntax file, it evaluates all of these character sets and tests each keyword string against the character sets in the order in which they were encountered in the program. If all the characters which constitute a particular keyword are members of the specified set, the keyword logic is set up so that it will recognize the keyword only if the immediately following character is not in the set. In the example above, [distinguish keywords {'a-z'} ] will do the trick. The "©stickyª" statement also affects the recognition of keywords. ## Distinguish Lexemes The "distinguish lexemes" ©configuration switchª is used in conjunction with the "©disregardª" statement and the "©lexemeª" statement to resolve the ©shift-reduce conflictªs which often crop up when suppressing white space. The difficulty with suppressing white space is that you wish it to be optional in cases like "x+y", where it is not necessary in order to parse correctly, but you want to require it in situations such as "mytype x", where it is necessary to separate otherwise indistinguishable constructs. If the white space were optional, it would be necessary to allow for "mytypex", but it would be impossible to determine if this were to be interpreted as "mytype x", "mytyp ex", or any of the many other possibilities. The distinguish lexemes switch causes AnaGram to make the white space optional where doing so causes no ambiguity and makes it mandatory where to make it optional would lead to ambiguity. In the example given above, "mytypex" would be treated as a single name, and another name would have to follow separating white space. The default value for distinguish lexemes is OFF. It is anticipated that this will be changed to ON in future releases of AnaGram. ## Duplicate Production This ©warningª message appears when a ©productionª appears twice in your ©grammarª. You will have a number of ©reduce-reduce conflictªs as a consequence. Eliminate the duplicate, and the conflicts it caused will go away. ## Edit Command "Edit command" is a ©configuration parameterª which accepts a string value. It is no longer used and is retained only for file compatiblity with the DOS version of AnaGram. ## Embedded C You may encapsulate pieces of C or C++ code in your ©syntax fileª more or less arbitrarily. Such pieces of code will simply be copied to the ©parser fileª in the order in which they are encountered. Each such piece of code must be enclosed with braces({}). The left brace must be on a new line, and nothing except comments may follow the right brace. AnaGram does not inspect the interior of such a piece of C code except to identify character constants, strings, comments and blocks surrounded with braces so that it does not identify the end of the embedded C prematurely. Note that AnaGram will use the status of the ©nest commentsª ©configuration switchª in effect at the beginning of the embedded C. AnaGram, of course, can be confused by unterminated strings, unbalanced brackets, and unterminated comments. The most likely outcome, in such a situation, is that AnaGram will encounter an end of file looking for the end of the embedded C. Should this happen, AnaGram will identify the beginning of the piece of embedded C which caused the problem. If your syntax file begins with a block of embedded C, called the "©C prologueª", it will be copied to the very beginning of the parser file, preceding all of AnaGram's output. You may use such an initial block of embedded C to guarantee that program title comments, copyright notices and important definitions are at the very beginning of your parser file. The code you include as embedded C, of course, has to coexist with the code AnaGram generates. In order to keep the potential for name conflicts to a minimum, all variables and functions which AnaGram defines begin with the letters "ag_". You should avoid variable names which begin with these letters. If AnaGram finds no embedded C in a syntax file, and you ask it to build a parser, it will automatically generate a main program that calls your parser. If you don't want it to do this, you may turn off the ©main programª ©configuration switchª. ## Empty Keyword String This ©warningª appears when you have a keyword string that contains no characters whatsoever. ©Keyword stringsª must contain at least one character. If you wish a null match, use a ©null productionª instead. ## Enable Mouse "Enable mouse" is a ©configuration switchª that defaults to on. It is not used in the Windows version of AnaGram and has been retained only for file compatibility with the DOS version. ## Enum Constant Name The "enum constant name" ©configuration parameterª allows you to select the name AnaGram will use for the set of enumeration constants it defines in the ©parser headerª file for your ©parserª. The value of "enum constant name" should be a string containing the '%' character. AnaGram will substitute each token name in turn into this template as it creates the list of enumeration constants. If it finds a '$' character it will substitute the name of your parser. The default value of "enum constant name" is "$_%_token". ## Enumeration Constants In your ©parser headerª file, AnaGram includes a typedef enum statement which provides enumeration constants corresponding to all the named constants in your grammar. The names of the enumeration constants themselves are defined by the ©enum constant nameª ©configuration parameterª. These constants are useful when dealing with ©semantically determined productionsª. ## Enum Within a ©configuration sectionª, you may use an "enum" statement to define numeric values for any number of tokens just as you define enumeration constants in C. The syntax is effectively the same as the enum statement in C: [ enum { first = 60, second, third, fourth = 'a', fifth, } ] is exactly equivalent to first = 60 second = 61 third = 62 fourth = 'a' fifth = 'b' ## eof "eof" is a quasi reserved word in AnaGram, used to specify an end of file token. You may use another token as an end of file delimiter by setting the ©Eof Tokenª ©configuration parameterª. eof is not required unless you use ©automatic resynchronizationª in your ©parserª. If you have not defined eof or specified an Eof Token parameter, ©File Traceª may show a syntax error when it encounters the end of a test file. There are various ascii values that are commonly used to represent an end of file. The end of a string in memory is commonly 0, DOS uses ^Z, Unix uses ^D, and Unix style stream I/O uses -1. It is often convenient then to define eof = -1 + 0 + ^D + ^Z ## Eof Token "Eof token" is a ©configuration parameterª which accepts a token name as a value. There is no default value. AnaGram does not need a specification for the eof token unless you are using its ©automatic resynchronizationª facility. If you use the ©automatic resynchronizationª capability of AnaGram, you must specify explicitly an end of file token. You can do this either by defining a ©terminal tokenª in your ©grammarª called eof or by using the "eof token" parameter to identify some other terminal token to be used as the end of file marker. You would do this only if you must use the name "©eofª" for some other purpose. Note that "eof" is case sensitive. Neither Eof nor EOF will qualify as end of file tokens unless you explicitly specify them using the eof token parameter. ## Eof Token Not Defined This ©warningª appears if you have requested either ©error token resynchronizationª or ©automatic resynchronizationª and you have not defined an ©eof tokenª. The resynchronization procedure will not work correctly at end of file. ## Error Action The error action is one of the four ©parser actionªs of a traditional ©parsing engineª. The error action is performed when the parser has encountered an input token which is not admissible in the current state. The further behavior of a traditional parser is undefined. ## Error Defining "Error defining TXXX: <token representation>" is a ©warningª message which appears if errors are encountered while attempting to evaluate the ©character setª for the specified ©tokenª. This warning is always generated in addition to more detailed warnings that are made when the actual errors are encountered. ## Error frame "Error frame" is a ©configuration switchª which defaults to off. You use this switch to specify the ©error diagnosisª capabilities of your parser. If this switch is set and the ©diagnose errorsª switch is set, i.e., on, your parser will include a function which will determine the "context" of any ©syntax errorª, that is, the token the parser was trying to complete. To determine the context of an error, your parser will scan backwards through the ©parser state stackª, examining ©characteristic rulesª until it finds a state which can accept a unique ©nonterminalª reduction token that you have not marked as ©hiddenª. It will then set PCB.©error_frame_ssxª to the ©parser stack indexª for that level. ## ERROR_CONTEXT ERROR_CONTEXT is a macro AnaGram defines for you. If your parser encounters a ©syntax errorª, you have enabled the ©error frameª ©configuration switchª, and you have defined a ©context typeª, ERROR_CONTEXT will enable you to access the ©contextª as of when the parser encountered the beginning of the ©error_frame_tokenª. ## Error Diagnosis "Error diagnosis" and ©error recoveryª are the two aspects of ©error handlingª. If in the ©embedded Cª portion of your syntax file you define a macro called ©SYNTAX_ERRORª, it will be invoked by the parser when a ©syntax errorª is encountered. If you have set the ©diagnose errorsª ©configuration switchª, the ©error_messageª field of the ©parser control blockª will contain a pointer to a string containing a diagnostic message. The diagnostic is of the form "Missing <token name>" or "Unexpected <token name>". If you do not define SYNTAX_ERROR it will be automatically defined so that a message will be written to stderr. If the ©lines and columnsª switch has been set you will have the current line number and column number available for your diagnostic message. If you have set the ©error frameª switch as well as the diagnose errors switch, the variable PCB.©error_frame_tokenª will identify the ©nonterminal tokenª the parser was trying to recognize when the error was encountered. Of course, if your parser is controlling direct keyboard input, a diagnosis might be unnecessary. In this case you might define SYNTAX_ERROR so that it simply beeps at the user and let it go at that. ## Error Handling Rarely is a parser built to read an arbitrary input file. The normal situation is that the parser is built to read files that conform to the rules specified in a grammar, rules that describe a class of input files rather than all possible input files. If the input file does not conform to the grammar, the parser will detect a ©syntax errorª. There are two aspects to error handling in your parser: ©error diagnosisª and ©error recoveryª. Error diagnosis consists in informing your user that something unexpected has happened. Error recovery consists in either aborting the parse, or getting it started again in some reasonable manner. AnaGram provides several options for both error diagnosis and error recovery. When a syntax error is encountered, first your error diagnosis option is executed and then your error recovery option is executed. ## error_message error_message is a field in a ©parser control blockª to which your ©error handlingª procedures may refer. If you have set the ©diagnose errorsª ©configuration switchª, on encountering a ©syntax errorª your ©parserª will create a string containing an appropriate diagnostic message and store a pointer to it into PCB.error_message. ## Error Trace "Error Trace" is both a ©configuration switchª and the name of an option in the ©Action Menuª. If the switch is on, AnaGram adds code to your parser to capture state information to a file in case of a ©syntax errorª. The Error Trace option can then read this information and prepare a pre-built ©Grammar Traceª showing you the state of the parser at the time of the error. The name of the file is determined by the macro ©AG_TRACE_FILE_NAMEª. AnaGram will provide a default definition for the macro consisting of the name of your ©syntax fileª plus the extension ".etr". You may override this definition by defining AG_TRACE_FILE_NAME in your ©embedded Cª. If error trace is enabled, AnaGram will also enable the Error Trace option on the ©Action Menuª. If you select Error Trace AnaGram will initialize a ©Grammar Traceª window from the error trace file you select. The parser stack of the trace will be as it was when the error occurred. The last line of the parser stack pane will show the ©lookahead tokenª that caused the syntax error. You may then use the Grammar Trace to explore the nature of the syntax error your parser encountered. AnaGram will warn you if the error trace file is older than the syntax file, since under those conditions, the error trace file might be invalid. ## AG_TRACE_FILE_NAME AG_TRACE_FILE_NAME is a C macro used to determine the name of the file your parser will write when it encounters a ©syntax errorª if you have enabled the ©error traceª ©configuration switchª. You may define AG_TRACE_FILE_NAME in your ©embedded Cª. AnaGram provides a default definition given by the name of your ©syntax fileª with the extension ".etr". ## Error Recovery Error recovery is the process of continuing after a ©syntax errorª. AnaGram offers several options. These are controlled by ©configuration parameterªs and by your grammar. If you do not specify any error recovery, your parser will simply return to the calling program when it encounters a syntax error. ©PCBª.©exit_flagª will be set to two, to indicate termination on syntax error. If you wish your parser to simply ignore the erroneous token and continue, set PCB.exit_flag to zero in your ©SYNTAX_ERRORª macro. You might use this option if your parser is dealing directly with keyboard input. You may wish to use YACC type error handling. To do this, simply incorporate a token called "error" in your grammar, or specify some other token as an ©error tokenª. On syntax error, your parser will back up to the most recent state where "error" was acceptable input, treat the bad input as an instance of error, and then skip all input until it finds an acceptable input token. At that point it will proceed as though nothing had happened. AnaGram also provides an ©automatic resynchronizationª option, which uses a complex heuristic to compare input tokens against all stacked states in order to find the best state from which to continue. ## Error Token Resynchronization One of your options for ©error recoveryª after a ©syntax errorª is a technique similar to that provided in YACC. You include a terminal token called "error" in your grammar. (Or, use the ©error tokenª configuration parameter to specify some other token to serve this purpose.) When the parser encounters an error in the input, after invoking the ©SYNTAX_ERRORª macro, it backs up the ©parser state stackª to the most recent state in which "error" was an acceptable input. It then shifts to the new state as though it had seen an actual "error" token. At this point, it skips over any character in the input which is not an acceptable input character for this state. Once it does find an acceptable input character, it continues processing as though nothing had happened. ## error_frame_ssx error_frame_ssx is a field in a ©parser control blockª to which your ©error handlingª routines may refer. When your ©SYNTAX_ERRORª macro is called, if you have set both the ©diagnose errorsª and ©error frameª configuration switches, error_frame_ssx will contain the value of the ©parser stack indexª at the beginning of the ©error_frame_tokenª. For example, if in a syntax file, you fail to close a comment, AnaGram will encounter an illegal end of file in the comment. In this situation, error_frame_token is the token for a comment, and error_frame_ssx gives the parser stack depth at the beginning of the comment. ## error_frame_token error_frame_token is a field in a ©parser control blockª to which your ©error handlingª routines may refer. If you have set both the ©diagnose errorsª and ©error frameª ©configuration switchªes, when your ©SYNTAX_ERRORª macro is called, it will contain the ©token numberª of the error_frame_token. ## error, Error Token "Error token" is a ©configuration parameterª that takes a token name for a value. It has no default value. If you do not specify it, and your grammar has a terminal token called "error", it will be used as the error token. If you have an error token defined your parser will presume that you wish to use the ©error token resynchronizationª method of ©error recoveryª. ## Escape Backslashes "©Escape backslashesª" is a ©configuration switchª that defaults to off. When turned on, the ©line numbersª switch will write pathnames with doubled backslashes. The switch is no longer necessary, since AnaGram now uses forward slashes in the pathnames in #line directives rather than backslashes.switch. ## Event Driven It is often convenient to configure your parser to be "event driven". In this situation, instead of calling your parser once to process the entire input, you call an ©initializerª to initialize the parser, and then you call the parser once for each input token. Each time you call it, the parser processes the single input token until it can do no more. You can interrogate the ©exit_flagª field of the ©parser control blockª to determine whether the parse is complete or whether the parser encountered an error. Event driven parsers are especially convenient for dealing with terminal input or communications protocols. ## Event Driven Parser Cannot Use Pointer Input This ©warningª message appears if you specify pointer input for your ©parserª and also specify that it should be event driven. If you are going to use ©pointer inputª, you should not specify your ©parserª as event driven. Conversely, if you really want an ©event drivenª parser, you cannot specify pointer input. ## Excessive Recursion This ©warningª message appears if an internal stack in AnaGram overflows because of the complexity of an expression in your ©grammarª. Simplify your grammar by using ©definitionª statements to name subexpressions. ## exit_flag exit_flag is a field in the ©parser control blockª. When your parser returns, PCB.exit_flag contains an exit code describing the outcome of the parse. Mnemonic values for the exit codes are defined in the parser header file AnaGram generates. These mnemonics, their values and their meanings are: AG_RUNNING_CODE = 0: Parse is not yet complete AG_SUCCESS_CODE = 1: Parse terminated successfully AG_SYNTAX_ERROR_CODE = 2: Syntax error encountered AG_REDUCTION_ERROR_CODE = 3: Bad reduction token encountered AG_STACK_ERROR_CODE = 4: Parser stack overflowed AG_SEMANTIC_ERROR_CODE = 5: Semantic error, user defined An AnaGram parser checks exit_flag on return from every ©reduction procedureª. AnaGram will exit with the flag unchanged if it is non-zero. To halt a parse from a reduction procedure, then, you need only set the exit_flag to AG_SEMANTIC_ERROR_CODE, or any other unused value greater than zero that suits your needs. ## Expansion, Expansion Rule In analyzing a ©grammarª, we are often interested in the full range of input that can be expected at a certain point. The expansion of a ©tokenª or state shows us all the expected input. An expansion yields a set of ©marked ruleªs. The ©marked tokenª in each rule shows us what input to expect. The set of expansion rules of a (©nonterminalª) token shows all the expected input that can occur whenever the token appears in the grammar. The set consists of all the ©grammar ruleªs produced by the token, plus all the rules produced by the first token of any rule in the set. A ©marked tokenª for an expansion rule of a token is the first element in the rule. The expansion of a state consists of its ©characteristic ruleªs plus the expansion rules of the marked token in each characteristic rule. ## Expansion Chain You may select an Expansion Chain window from the ©Auxiliary Windowsª popup menu of most windows that contain ©expansion ruleªs. The Expansion Chain window is extremely useful for indicating why a particular ©grammar ruleª is an ©expansion ruleª in a particular state. To see a chain of productions that produces a desired expansion rule, select the expansion rule with the cursor bar, press the right mouse button for the Auxiliary Windows menu, and select Expansion Chain. The Expansion Chain window will then present a sequence of expansion rules, using the same format as the Expansion Rules window, but subject to the constraint that each rule is produced by the ©marked tokenª in the previous line. The first rule in the window is a ©characteristic ruleª for the given state. The last rule in the window is the rule selected by the cursor bar in the window from which you chose the Expansion Chain. It should be noted that this expansion is not unique. There may be other derivations. ## Expansion Rules You may select an Expansion Rules window from the ©Auxiliary Windowsª popup menu of most windows which display ©marked rulesª. The Expansion Rules window shows the complete set of ©expansion ruleªs for the ©marked tokenª in the highlighted rule. In other windows, including all trace windows, the Expansion Rules window shows the expansion of the token on the highlighted line. ## F1 Use the F1 key to bring up a context sensitive help window. Because of various peculiarities of the Windows API, there are a few contexts where the F1 key does not work; however, generally the ©help cursorª works where F1 does not and vice versa. ©Helpª windows have hypertext links to related help windows. In a help window, the right mouse button pops up a menu of all the links for the window. ## extend pcb The "extend pcb" statement is an ©attribute statementª that allows you to add declarations of your own to the ©parser control blockª. With this feature, data needed by ©reduction procedureªs can be stored in the pcb rather than in global or static storage. This capability greatly facilitates the construction of ©thread safe parsersª. The extend pcb statement may be used in any configuration section. The format is as follows: extend pcb { <C or C++ declaration>... } It may, of course, extend over multiple lines and may contain any C or C++ declarations. AnaGram will append it to the end of the parser control block declaration in the generated parser ©header fileª. There may be any number of extend pcb statements. The extensions are appended to the pcb in the order in which they occur in the syntax file. The extend pcb statement is compatible with both C and C++ parsers. Note that even if you are deriving your own class from the parser control block, you might want to use the extend pcb to provide virtual function definitions or other declarations appropriate to a base class. ## Far Tables "Far tables" is a ©configuration switchª which defaults to off. If it is set, when AnaGram builds a ©parserª it will declare the larger tables it builds as FAR. This can be a convenience when using some memory models with 8086 architecture. ## Fatal Syntax Errors This ©warningª message occurs when AnaGram cannot complete the ©Analyze Grammarª command on your ©syntax fileª because of errors in your syntax file. ## File Trace You can use the File Trace facility to verify your grammar, even before you have implemented ©reduction proceduresª or any other code. Thus you can defer writing procedural code until you have the grammar working to your specifications. To run File Trace, select File Trace from the ©Action Menuª or click on the File Trace button. Select a test file. When the ©File Trace Windowª appears, double click at any point in the ©test file paneª, or click the ©Parse Fileª button to parse the entire file. AnaGram will parse up to the point you have selected according to the rules in your ©grammarª. If the test file does not conform to the rules of the grammar, the parse will halt with a ©syntax errorª. You can then inspect the ©Parser Stack paneª and the ©Rule Stack paneª to get an idea of the nature of the problem. AnaGram uses different colors to distinguish the portion of the test file that has been parsed from the portion that has not been parsed, so the location of the error should be readily apparent. Since the syntax error often occurs somewhat downstream from the actual error, you may need to back the parse up and approach the error slowly. In the Test File pane, double click at any point prior to the error to back the parse up to that point. You can then click on the ©Single Stepª button to perform a single parser action. You may also use the cursor keys to control the parse. As long as no error is encountered, the parse is locked to the blinking cursor. If you cursor past the syntax error, however, the parse can no longer track the cursor so the cursor location will differ from the parse location . The cursor and parse locations will also differ after you single click at any point other than the current parse location. When the cursor and the parse location are thus out of synch, the Single Step button is replaced with a ©Synch Parseª button. You can click on Synch Parse to get the parse back in synch with the cursor. The File Trace option will be greyed out on the ©Action Menuª if your grammar has ©empty recursionª, since such a grammar may cause infinite loops in the parser. Because a File Trace is based on character codes, it will also be greyed out on the ©Action Menuª if your parser uses ©token inputª rather than character input. All parser actions performed by a File Trace update the ©trace coverageª counts, enabling you to verify the extent to which your test files exercise your parser. Normally, AnaGram reads test files in "text" mode, discarding carriage return characters. If your parser needs to recognize carriage return characters explicitly, you should turn the "©test file binaryª" switch on. ## File Trace Window The ©File Traceª window normally consists of three panes: The ©Parser Stack paneª The ©Test File paneª The ©Rule Stack paneª If your grammar uses ©semantically determined productionsª, the ©Reduction Choices paneª will appear when necessary to allow you to select a ©reduction tokenª. The choice that you make will be remembered and reused if you should back up the parse and parse past this point again. The remombered choice is not made automatically when you use ©Single Stepª. Thus, if you wish to change your choice, position the cursor at the location where the choice must be made and Single Step past the choice. If you ©reloadª the test file, the choices you have made will be discarded. The active pane has a distinctively colored title panel and cursor bar. You can use the tab key to tab among the panes. The function of other keyboard keys depends on which pane is active. Along the bottom of the File Trace Window is a toolbar with two status boxes: ©Parse Locationª ©Parse Statusª and five buttons: ©Single Stepª ©Parse Fileª ©Resetª ©Reloadª ©Helpª If the blinking cursor loses synch with the current parse location, the Single Step button is replaced with the ©Synch Parseª button. ## Grammar Trace Window The ©Grammar Traceª window normally consists of three panes: The ©Parser Stack paneª The ©Allowable Input paneª The ©Rule Stack paneª If your grammar uses ©semantically determined productionsª, the ©Reduction Choices paneª will appear when necessary to allow you to select a ©reduction tokenª. The active pane has a distinctively colored column header and cursor bar. You can use the tab key to tab among the panes. The function of other keyboard keys depends on which pane is active. Along the bottom of the Grammar Trace Window is a toolbar with a ©Parse Statusª box, a ©text entryª field and four buttons: ©Proceedª ©Single Stepª ©Resetª ©Helpª In the ©Parser Stack paneª you can see a representation of the ©parser state stackª and ©parser stateª as they might appear in the course of execution of your ©parserª. You can examine the ©allowable inputª tokens and see the changes to the state and the state stack caused by any input token you choose. The ©Rule Stack paneª shows the relationship between the contents of the parser stack and your ©grammarª. If your grammar uses ©semantically determined productionsª, you can select the appropriate ©reduction tokenª from the ©Reduction Choices paneª. You can enter text characters directly in the ©text entryª field. This means you can run a Grammar Trace like a ©File Traceª where the test file is replaced by the characters you type in the text entry field. This is a very convenient way to check out your grammar. ## Test File, Test File Pane In the ©File Traceª, the file under test is displayed in the upper right pane. To parse to a specific point, double click at that point. As long as the parse location and the cursor are synchronized, when you use the cursor keys to move the cursor, the parse will track the cursor. If the parse encounters a ©syntax errorª, it will not be able to go beyond the location of the error. In this situation, moving the cursor right or down will cause the cursor position to differ from the parse location. The parse and cursor positions can also differ if you single click anywhere in the Test File pane. If the parse location and the cursor are thus not synchronized, the ©Single Stepª button will be replaced with a ©Synch Parseª button. Click on the Synch Parse button to get the cursor and the parse back in synch. Of course, the parse will still not be able to proceed past a syntax error. In the default color scheme, parsed text is shown on a lighter background than is unparsed text. If your grammar uses ©semantically determined productionªs, the parse will halt when one is encountered and the ©reduction choices paneª will be displayed so you may select the appropriate ©reduction tokenª. At any time you can click on the ©Reset buttonª to reset the parse to the beginning of the test file. If you modify the test file, you can click on the ©Reload buttonª to load the modified file and reset the parse. Normally, AnaGram reads test files in "text" mode, discarding carriage return characters. If your parser needs to recognize carriage return characters explicitly, you should turn the ©test file binaryª ©configuration switchª on. Sample test files are provided with the FFCALC and FC ©examplesª. ## Parse Location The current location of the ©File Traceª parser in the ©test file paneª. The format is <line number>:<column number>. ## Parse Status The current state of the ©File Traceª or ©Grammar Traceª parser. Ready: The parser is ready for input. Running: The parser is processing input. Parse Complete: The parser has reached the end of the input. Click on ©resetª or ©reloadª to restart the parse. Syntax error: A syntax error has been encountered. The parser cannot go any further. Unexpected end of file: The parser has reached the end of the actual input but the grammar still expects more. Select reduction token: The parser encountered a ©semantically determined productionª. Select a ©reduction tokenª from the ©Reduction Choices paneª. Selection error: The reduction token selected from the Reduction Choices pane was not allowable input in the present state. Select another reduction token. ## Parse File Use the Parse File button in the ©File Traceª to parse all the way to the end of file. The parse will not stop until it encounters a ©syntax errorª, a ©semantically determined productionª, or the end of file. ## Reset Use the Reset button in the ©File Traceª or ©Grammar Traceª to reset the parse to its initial state. This is most convenient when using a ©Conflict Traceª, ©Error Traceª, or other ©Auxiliary Traceª since these traces seldom begin at state 0. ## Reload The Reload button in the ©File Trace Windowª rereads the test file. This is convenient if you modify the test file while you are testing the ©grammarª. ## Lookahead Token In an ©LALR-1 parserª the "lookahead token" is the next token to be processed. For each ©parser stateª there is a list of tokens that may be seen in this state. For each token there is a corresponding ©parser actionª. The parser scans the list looking for the lookahead token and then performs the corresponding parser action. If the lookahead token cannot be found and there is no ©default reductionª, the parser signals a ©syntax errorª. In File Trace, and in some circumstances in Grammar Trace, the lookahead token can be seen on the last line of the ©Parser Stack paneª. ## GET_CONTEXT If you have defined a "©context typeª" ©configuration parameterª, and wish to maximize the performance of your parser, you should write a GET_CONTEXT macro which stores the context of the input token directly in ©CONTEXTª, the current stack location. Otherwise, you can write your ©GET_INPUTª macro so that it stores context into ©PCBª.©input_contextª. The default definition for GET_CONTEXT will then copy PCB.input_context to the ©context stackª at the appropriate time. ## GET_INPUT GET_INPUT is a macro which you should define to control ©parser inputª if your parser is not ©event drivenª and you are not using ©pointer inputª. If you don't define it, AnaGram will define it by default to read a single character from stdin: #define GET_INPUT (PCB.input_code = getchar()) ©PCBª.©input_codeª is an integer field in the ©parser control blockª which is used to hold the current character code. You may also want GET_INPUT to set the values of ©input_contextª or ©input_valueª. It may call an input function, or it may execute in-line code when it is invoked. ## iso latin 1 The "iso latin 1" ©configuration switchª controls case conversion on input characters when the ©case sensitiveª switch is set to off. When "iso latin 1" is set, the default ©CONVERT_CASEª macro is defined to convert correctly all characters in the latin 1 character set. When the switch is off, only characters in the ASCII range (0-127) are converted. ## Dragon Book The "dragon book" is the classic reference on formal parsing: Compilers: Principles, Techniques, and Tools Aho, Sethi, and Ullman Addison-Wesley, 1986. It is called the "dragon book" because of its colorful cover illustration showing a knight in armour ("data flow analysis") armed with sword ("©LALR parser generatorª") and shield ("syntax directed translation") at his PC attacking a bright red dragon ("complexity of compiler design"). ## LALR-1 Parser An LALR-1 parser is a ©parserª created from a ©grammarª by an ©LALR parser generatorª. ## LALR Parser Generator LALR(k) (LookAhead Left-to-right Rightmost derivation) parser generators are programs that create parsers algorithmically from formal grammars. The (k) refers to the number of lookahead symbols used to make parsing decisions. Normally, k = 1. LALR parsers are a subset of the class of so-called LR parsers. LALR parsers are generally more compact and less costly to create. These advantages are obtained at a slight sacrifice in generality. Although is possible to contrive an LR grammar which has ©conflictªs when analyzed with the LALR algorithm, such situations rarely occur in practice, and can be easily resolved by rewriting a few rules. In the ©dragon bookª, section 4.7, the authors list the following attractive properties of LR parsing: LR parsers can be constructed to recognize virtually all programming-language constructs for which context-free grammars can be written. The LR parsing method is the most general nonbacktracking shift-reduce parsing method known, yet it can be implemented as efficiently as other shift-reduce methods. The class of grammars that can be parsed using LR methods is a superset of the class of grammars that can be parsed with predictive parsers. An LR parser can detect a syntactic error as soon as it is possible to do so on a left-to-right scan of the input. ## Getting Started AnaGram is an ©LALR parser generatorª. Its input is a ©syntax fileª, which you prepare with an ordinary programming editor. Its output is a ©parser fileª. which you can compile with a C or C++ compiler on any platform and link into your program. To compile on Unix platforms, set the ©no crª ©configuration switchª. AnaGram has extensive context-sensitive hypertext ©helpª. In any AnaGram window, press ©F1ª or select an item with the ©Help Cursorª. Further documentation in HTML format, including documentation of examples, is found in the html subdirectory. AnaGram also has a comprehensive hard-copy manual, the AnaGram User's Guide. If you are new to AnaGram, you might begin by reviewing the Help Topics ©How AnaGram Worksª and ©Program Developmentª, and looking at An Annotated Example and Summary of AnaGram Notation in the HTML documentation. If you are not already familiar with formal parsing techniques, you may want to read Introduction to Syntax Directed Parsing in the HTML documentation. Note also the Fahrenheit to Celsius conversion examples in the examples/fc directory, which comprise a graded sequence of syntax files illustrating most of the basic principles of ©syntax directed parsingª in easy steps. Documentation is in html/fc.html. AnaGram has many features, many of which are not commonly found in parser generators: the ©configuration sectionª ©thread safe parsersª C++ support the ©disregardª and ©lexemeª statements ©event drivenª parsers ©character setsª ©virtual productionsª ©File Traceª, ©Grammar Traceª ©automatic resynchronizationª ©error token resynchronizationª To familiarize yourself with the many options available for configuring your parsers, select ©Configuration Parametersª from the ©Browse Menuª. Use ©F1ª or the ©Help Cursorª to pop up explanations of the various parameters. If you don't find the information you need, please visit the AnaGram web page at http://www.parsifalsoft.com for further information and support. ## How AnaGram Works AnaGram contains an ©LALR Parser Generatorª which creates a table driven ©LALR-1 parserª from a ©grammarª written in a variant of Backus-Naur Form. AnaGram works in two steps. In the first step, or analysis phase, it reads a ©syntax fileª and compiles a number of tables describing the grammar. In the second step, or build phase, it writes two output files: a ©parser fileª written in C or C++ and a ©header fileª. Syntax files normally have the extension .syn. The rules for writing syntax files are given in the AnaGram User's Guide and in the Summary of AnaGram Notation in the HTML documentation. The header file contains definitions and declarations, including the definition of a ©parser control blockª. The parser file consists of: The ©C prologueª, if any. Definitions and declarations provided by AnaGram. ©Reduction procedureªs. a customized ©parsing engineª. a ©parse functionª to be called when input is to be parsed. The name of the parser file is controlled by the ©parser file nameª ©configuration parameterª. The name of the parse function itself is controlled by ©parser nameª. In the default case, the parser file will have the same name as the syntax file, with the extension .c. The name of the parse function is given by the ©parser nameª parameter. It defaults to the name of the syntax file. ## Examples The EXAMPLES directory of the AnaGram distribution disk contains a number of examples to help you get started. Documentation for the examples, in HTML format, is located in the html directory (start at index.html or examples.html). The traditional Hello, World, in examples/hw, is a good example for getting familiar with the mechanical procedures of building both C and C++ parsers from ©syntax fileªs. The Fahrenheit/Celsius conversion examples in the examples/fc directory on your AnaGram diskette comprise a graded sequence of syntax files which illustrate most of the basic principles of ©syntax directed parsingª in easy steps. In addition, these examples demonstrate many features of AnaGram which are not found in other parser generators: the ©configuration sectionª ©character setsª ©virtual productionsª ©error token resynchronizationª ©File Traceª the ©disregardª and ©lexemeª statements ©event drivenª parsers The Four Function Calculator (examples/ffcalc) is used traditionally to demonstrate parser generators. If you are already familiar with ©syntax directed parsingª this example will give you a good overview of the basics of AnaGram. An annotated version of this example may be found in AnaGram's HTML documentation. The FFCALC example illustrates the use of ©precedence rulesª to resolve ©conflictsª. Other examples are available to demonstrate additional features of AnaGram. RCALC (examples/rcalc) is a simple four function calculator which accepts roman numeral input. It illustrates the following AnaGram features: ©pointer inputª ©SYNTAX_ERRORª macro ©context stackª DSL (examples/dsl) is a complete DOS script language, which provides capabilities well in excess of DOS batch files. DSL is a complete working program, used in the past to create AnaGram's install program. Some of the specific features of AnaGram which it illustrates are: ©distinguish lexemesª ©distinguish keywordsª ©far tablesª MPP is a fully functional macro preprocessor for C or C++. Included with MPP are two C grammars, either of which may be incorporated into MPP. MPP uses several parsers that work together: TS.SYN is the primary token scanner parser that identifies tokens, and handles preprocessor commands. MAS.SYN is used to do macro argument substitution. CT.SYN is used to identify tokens that result from string concatenation during macro argument substitution. EX.SYN is used to evaluate constant expressions in #if preprocessor statements. Among the more powerful features of AnaGram that MPP illustrates are: ©semantically determined productionsª ©event drivenª parsers ## Goal, Goal Token, Start Token The ©grammar tokenª is the token which represents the "top level" in your grammar. Some people refer to it as the "goal" or "goal token" and others as the "start token". Whichever it is called, it is the single token which describes the complete input to your parser. The most common way to specify a grammar token is as follows: grammar -> statements?..., eof This production tells AnaGram that the input to your parser consists of a (possibly empty) sequence of statements followed by an end of file token. There are a number of ways of specifying which token in your ©syntax fileª represents the top level of your grammar. You may simply name it "grammar", or you may tag it with a '$' character when you define it, or you may set the ©grammar tokenª ©configuration parameterª. If you should inadvertently tag several tokens with the '$' character and/or set the grammar token parameter, it is the last such specification in the file which wins. Some people develop their grammars bottom up, gradually adding new levels of complexity. In the course of development, they may specify a number of tokens as grammar tokens and forget to remove the old specifications. Notice that if you define the token "grammar" anywhere in your syntax and specify the grammar token otherwise, "grammar" will not be the grammar token. This is to keep "grammar" from being a reserved word. If you need to use it in your syntax for something other than the whole grammar, you are free to do so. ## Grammar Traditionally, a "grammar" is a set of ©productionªs which taken together specify precisely a set of acceptable input streams, in terms of an abstract set of ©terminal tokensª. The set of acceptable input streams is often called the "language" defined by the grammar. In AnaGram, the term "grammar" also includes ©configuration sectionsª as well as the ©definitionsª of ©character setsª and ©virtual productionsª which augment the collection of productions. The term is often used in contrast to the term "©syntax fileª" which is used to signify the complete AnaGram source file including reduction procedures and embedded C or the term "©parserª" which refers to AnaGram's output file. A grammar is often called a "syntax", and the rules of the grammar are often called syntactic rules. ## Grammar Analysis The major function of AnaGram is the analysis of context-free grammars written in a particular variant of Backus-Naur Form. The analysis of a grammar proceeds in four stages. In the first, the input grammar is analyzed and a number of tables are built which describe all of the ©productionªs and components of the ©grammarª. In the second stage, AnaGram analyzes all of the character sets defined in the grammar, and where necessary, defines auxiliary tokens and productions. In the third stage, AnaGram identifies all of the states of the parser and builds the go-to table for the parser. In the fourth stage, Anagram identifies ©reduction tokensª for each completed ©grammar ruleª in each state and checks for ©conflictªs. Use the ©Analyze Grammarª command to cause AnaGram to analyze your grammar. ## Grammar Is Ambiguous This ©warningª message appears if your ©grammarª contains ©conflictªs. AnaGram will resolve ©shift-reduce conflictsª by selecting the shift option. It will resolve ©reduce-reduce conflictsª by selecting from the conflicting ©grammar ruleªs the one which appears first in the ©syntax fileª. ## Grammar Rule A "grammar rule" is the right hand side of a production. It is a sequence of ©rule elementsª. Each rule element identifies some token, which can be either a ©terminal tokenª or ©nonterminal tokenª. A grammar rule is "matched" by a corresponding sequence of tokens in the input stream to the parser. The rule elements in the grammar rule may be ©token nameªs, ©set expressionsª, ©character constantsª, ©immediate actionªs, ©keyword stringsª, or ©virtual productionsª. A grammar rule may be followed by an optional ©reduction procedureª. The ©semantic valuesª of the tokens that comprise the rule may be passed to the reduction procedure by using ©parameter assignmentsª. A grammar rule always makes up the right hand side of a production. The left hand side of the production identifies one or more ©nonterminal tokensª, or ©reduction tokensª, to which the rule reduces when matched. If there is more than one reduction token, the production is called a ©semantically determined productionª and there should be a ©reduction procedureª to select the correct reduction token at run time. ## Grammar Token The "grammar token" ©configuration parameterª may be used to specify the ©goalª, or "start" token for the syntax analyzer portion of AnaGram. Alternatively, you could simply call the token "grammar", or you could append a '$' character to it when you define it. Each grammar must have a grammar token specified before it can be analyzed or before a parser can be built. The grammar token is the single token to which the grammar finally condenses. When this token is identified by the parser, the parse is complete. ## Grammar Trace AnaGram's Grammar Trace facility lets you examine the workings of your ©parserª in detail. You can use the Grammar Trace as soon as you have analyzed your ©grammarª, even before you have written any ©reduction procedureªs or other code. Thus you can defer writing procedural code until you have the grammar working to your specifications. Select the ©Grammar Trace Windowª from the ©Action Menuª or click on the Grammar Trace button. In the ©Parser Stack paneª you can see a representation of the ©parser state stackª and ©parser stateª as they might appear in the course of execution of your ©parserª. The ©Rule Stack paneª shows the relationship between the contents of the parser stack and your ©grammarª. If your grammar uses ©semantically determined productionsª, you can select the appropriate ©reduction tokenª from the ©Reduction Choices paneª. At any stage, the ©Parser Stackª represents a parse in progress. It shows the sequence of ©tokenªs that have been input so far and the states in which they were seen. When a production is complete and the grammar rule is reduced, the tokens that make up the rule are removed from the stack and replaced by the token on the left side of the production. Initially, the Parser Stack contains only a ©lookahead lineª. To explore your grammar, choose ©tokenªs one by one from the ©Allowable Inputª pane. This pane shows the tokens allowable at the current state of the grammar, and the actions that result when the tokens are chosen. You can also enter text characters directly in the ©text entryª field. This means you can run a Grammar Trace like a ©File Traceª where the test file is replaced by the characters you type in the text entry field. This is a very convenient way to check out your grammar. Text entry is, of course, not appropriate for grammars that expect ©token inputª. In a ©File Traceª you can advance the parse no matter which pane is active. In a Grammar Trace there is a question as to whether input is intended to come from the Allowable Input pane or the text entry field. Therefore the parse can only be advanced when one of these two is active to indicate that it is the source of input. Specialized prebuilt Grammar Traces such as the ©Conflict Traceª and the ©Auxiliary Traceª can be selected from ©Auxiliary Windowsª popup menus where appropriate. All Grammar Trace activity updates the ©trace coverageª counts. ## Text Entry It is sometimes more convenient to enter text in the text entry box on the ©Grammar Traceª toolbar than to select individual tokens from the ©Allowable Input paneª. By entering text you can proceed quickly to a troublesome state without having to choose each individual token en route. After entering text, press Enter or click on the Proceed button to parse the text. Click on the single step button to work slowly through the text step by step. ## header file name The "header file name" parameter names the ©parser headerª file that AnaGram will generate when it builds your parser. This header file can be used with your parser or with other modules in your program. The header file contains a number of typedef statements and an number of macro definitions which are needed in your parser and may be useful in other modules. If the value of this parameter contains a '#' character, AnaGram will substitute the name of your syntax file for the '#'. The default value of "header file name" is "#.h". ## Help, Using Help There are 3 main ways to access AnaGram Online Help: Press F1 for context-sensitive help from most windows and menu items. Similarly, use the ©Help Cursorª from most windows and menu items. From the Help menu, you can bring up ©Help Topicsª and choose a topic. You can also get fly-over help for the toolbar buttons on the ©Control Panelª. File and Grammar Traces have a Help button. AnaGram's Help windows, unlike most others, remain on-screen until you dismiss them. This means you can refer to several topics at once. They have hypertext links to other Help topics. Also, right-clicking the mouse on a Help window or pressing F1 will pop up an Auxiliary Windows menu of all linked topics in the window. "Using Help" is always available from this popup menu. Note that, for the ©Warningsª, ©Configuration Parameterªs and ©Help Topicsª windows, F1 will give you help for the item on the highlighted line, whereas the Help Cursor allows you to select any line by clicking on it. AnaGram also has documentation in HTML format, indexed in the index.html file. This documentation covers Getting Started, examples, and some further topics mainly condensed from the User's Guide. Hard copy documentation is in the AnaGram User's Guide, which has the most detail. ## Hidden In a ©configuration sectionª of your grammar you may use an ©attribute statementª to declare one or more tokens to be "hidden". Tokens that are "hidden" do not appear in the ©token namesª table, and thus do not appear in syntax error diagnoses. When your parser attempts to determine the ©error frameª of a ©syntax errorª, it will disregard the tokens that have been declared hidden. The hidden declaration consists simply of the keyword hidden followed by a list of tokens, separated by commas and enclosed in braces ({ }): [ hidden { widget, wombat, foo, bar } ] You would use the "hidden" attribute primarily for tokens whose name would not mean anything to your users. ## Immediate Action Immediate actions are snippets of C code which are to be executed in the middle of a ©grammar ruleª. Immediate actions are denoted by a '!' character followed by either a C expression, terminated by a semicolon; or a block of C code enclosed in braces. For example, in a simple desk calculator example one might write the following: transaction -> !printf('#');, expression:x =printf("%d\n",x); Notice that the only apparent difference between an immediate action and a ©reduction procedureª is that the immediate action is preceded by '!' instead of '='. Notice that the immediate action must be followed by a comma to separate it from the following ©rule elementª. Immediate actions may also be used in ©definitionªs: prompt = !printf('#'); The above example, using this definition would then be: transaction -> prompt, expression:x =printf("%d\n",x); You could accomplish the same result by writing a ©null productionª and a reduction procedure: prompt -> =printf('#'); This is exactly how AnaGram implements immediate actions. ## Implementation Errors "Implementation errors" are errors your parser detects which are not the immediate result of bad input. When it encounters an implementation error, your parser will call a macro which you can define to deal with the problem in a manner suitable to your needs. If you don't provide these macros, AnaGram will make default definitions. There are two macros corresponding to two implementation errors: ©PARSER_STACK_OVERFLOWª ©REDUCTION_TOKEN_ERRORª ## Inappropriate Value This ©warningª message appears when the value assigned to a ©configuration parameterª is not appropriate to that parameter. Check the definition of the parameter, by opening the ©Configuration Parameters Windowª, selecting the parameter and pressing F1. ## Initializer For every ©parserª it generates, AnaGram generates an "initializer" function to call the parser. AnaGram names the initializer by prefixing the ©parser nameª with "init_". If your parser is ©event drivenª, you must call the initializer before you call the parser. If your parser is not event driven, AnaGram will normally include a call to the initializer in the parser. If you wish to be able to call your parser more than once without its being re-initialized, you may turn off the ©auto initª ©configuration switchª. When you do this, you assume responsibility for calling the initializer. If your parser is event driven, you must always call the initializer function. If the ©reentrant parserª switch is set, the initializer takes a pointer to the ©parser control blockª as its sole argument. Otherwise it takes no arguments. The initializer returns no value. All communication is by means of the ©parser control blockª. ## Input Character The actual unit of ©parser inputª is usually a single character. Note that you are not limited to eight-bit characters. Your parser will use the input character to index a translation table, ©ag_tcvª, to determine the ©token numberª for that character. The ©token numberª identifies the actual syntactic token. The character code itself will be the ©semantic valueª of the token. Note that AnaGram groups together all input characters that are syntactically indistinguishable into a single input token. ## input_code input_code is a field in the ©parser control blockª which contains the current ©input characterª, or, if your ©GET_INPUTª macro supplies ©token numberªs directly, the token number. If you write your own ©GET_INPUTª macro, you must make sure that you store the input character, or token number, you get into ©PCBª.input_code. ## INPUT_CODE(t) If you set both the ©pointer inputª and the ©input valuesª ©configuration parameterªs, you must provide an INPUT_CODE macro for your parser. In this situation, your parser will use the pointer to load the ©input_valueª field of the ©parser control blockª and uses the INPUT_CODE macro to extract the appropriate value for the ©input_codeª field. For example, if the input_value is a structure and the appropriate member field is called "id" you would write: #define INPUT_CODE(t) (t).id ## input_context "input_context" is a field which AnaGram adds to the definition of the ©parser control blockª structure when you define a ©context typeª ©configuration parameterª. If you choose, you can write your GET_INPUT macro so that it stores the context value in ©PCBª.input_context. The default definition for ©GET_CONTEXTª will then stack the context value at the appropriate time. You can think of PCB.input_context as a sort of temporary "parking place" for the context value. ## Input Scan Aborted This ©warningª message appears if AnaGram is unable to finish scanning your ©syntax fileª because of previous errors. ## input values "Input values" is a ©configuration switchª which defaults to off. If your ©parser inputª includes explicit ©token valueªs which are not simply the ascii values of corresponding ascii input characters, you must set the "input values" switch to inform AnaGram. Unless your parser is ©event drivenª or uses ©pointer inputª, you must also provide your own ©GET_INPUTª macro. If your parser uses pointer input, you must provide an ©INPUT_CODE(t)ª macro. The semantic value of an input token is to be stored in the ©input_valueª field of the parser control block. ## input_value input_value is a field in the ©parser control blockª which is used to store the semantic value of the input token. If you write your own ©GET_INPUTª macro, and you have set the ©input valuesª ©configuration switchª, you should make sure that you store the value of the ©input characterª or token into ©PCBª.input_value. ## Internal Error "AnaGram internal error: ..." is a ©warningª message which appears if one of AnaGram's internal consistency tests fails. This message should never appear if AnaGram is working properly. Usually AnaGram will abort on encountering an internal error, although under a small set of circumstances it may continue. Should this happen, it would be wise to close AnaGram and restart it. If you do get an internal error, please note the complete message identifing the problem and file a bug report, following the directions posted on the AnaGram web page at http://www.parsifalsoft.com. A copy of the relevant syntax file and a summary of the circumstances surrounding the problem would be greatly appreciated. ## Intersection In set theory, the intersection of two sets, A and B, is defined to be the set of all elements of A which are also elements of B. In an AnaGram ©syntax fileª, the intersection of two ©character setsª is represented with the '&' operator. The intersection operator has lower ©precedenceª than the ©complementª operator, but higher precedence than the ©unionª and ©differenceª operators. The intersection operator is ©left associativeª. ## Keyboard Support AnaGram can be controlled entirely from the keyboard. In the Control Panel, you can tab to any button and press Enter to select it. In addition to the conventional Windows keyboard functions, the following keys have been implemented: Escape closes any AnaGram window except the Control Panel. F8 toggles between an active AnaGram window and the Control Panel F10 accesses the Control Panel menu from any AnaGram Window. Shift F10 pops up the Auxiliary Windows menu ## Keyword, Keyword String Keywords are a very important feature of AnaGram. They provide an easy way to pick up special character sequences in your input, thereby eliminating the need for a lot of tedious ©productionªs. If AnaGram finds, on the right hand side of one of your ©grammarª productions, a string enclosed in double quotes, such as "IF", it automatically creates from the string a "keyword" which is incorporated into your parser. You may have any number of keywords. A keyword is treated as a single terminal token. Recognition of keywords is governed by the ©case sensitiveª switch. Your parser will look for a keyword in its input stream wherever you have defined this particular keyword to be legitimate input. It will do whatever lookahead is necessary in order to pick up the entire keyword. If several keywords match the input, such as IF and IFF, it will select the longest match, IFF in this example. Important points to notice about keywords: 1) Keywords take precedence over ordinary characters in the input stream - thus if the character I and the keyword IF are both legitimate input at some point, IF will be selected, if present, in preference to I. 2) Keywords are not reserved words. Your parser will only look for a keyword when it is in a state where that keyword is legitimate input. 3) Keywords do not participate in character sets and should not appear in definitions of character sets. In particular, they are not considered as belonging to the complement of a character set. Thus a keyword would not be considered legitimate input for the production next char -> ~( '/' + '*' ) 4) Keywords may appear in virtual productions. 5) Keywords may be named by means of a definition. AnaGram will list all the keywords in your grammar in the ©Keywordsª window. In addition, in numerous windows where the cursor bar selects a state, the ©Auxiliary Windowsª popup menu will list a Keywords option. This window will provide a list of the keywords acceptable in the selected ©parser stateª. On occasion, a kind of conflict, called a ©keyword anomalyª may occur. If so, such conflicts will be listed in the ©Keyword Anomaliesª window. The "©stickyª" ©attribute statementª is useful in dealing with keyword anomalies. ## Keyword Anomalies Found This ©warningª message indicates that AnaGram has found at least one ©keyword anomalyª in your ©grammarª. Open the ©Keyword Anomaliesª window to see a list of those that have been found. ## Keyword Anomaly In ©syntax directed parsingª, it is assumed that input ©tokenªs can be uniquely identified. In the case of ©keywordªs, however, there is the possibility that the individual characters making up the keyword, as well as the keyword taken as a whole, could constitute legitimate input under some circumstances. Thus ©keywordsª, though a powerful and useful tool, are not completely consistent with the assumptions that underlie ©syntax directed parsingª. This can occasionally give rise to a type of conflict, diagnosed by AnaGram, called a "keyword anomaly". AnaGram is quite conservative in its diagnoses, so that many keyword anomalies it reports are actually innocuous and can be safely ignored. Basically, a keyword anomaly is a situation where a keyword is recognized, causes a reduction, and the parser arrives in a state where the keyword is not legal input. If the keyword, seen simply as a sequence of characters, might have been legal input in the original state, AnaGram notes the existence of a keyword anomaly. If you have a keyword that causes a keyword anomaly and it is actually a reserved word in your grammar, the anomaly is by definition innocuous. You should use the ©reserve keywordsª statement to inform AnaGram that the keyword is reserved and the anomaly need not be diagnosed. To help identify and correct any problems associated with keyword anomalies, AnaGram provides the ©Keyword Anomaliesª window to identify the anomalies, and the ©Keyword Anomaly Traceª to help you understand a particular anomaly. ## Keyword Anomaly Trace A Keyword Anomaly Trace is a ready made ©grammar traceª window which you may select from the ©Auxiliary Windowsª menu of the ©Keyword Anomaliesª window. The anomaly trace provides a path to a state which illustrates the ©keyword anomalyª. In this state, the keyword is a reducing token, but after the reduction, it is not allowable input. ## Keyword Anomalies The Keyword Anomalies window is available only if your grammar has ©keywordª anomalies. Each entry in the Keyword Anomalies window consists of two lines. The first line identifies the ©parser stateª at which the ©keyword anomalyª occurs and the offending keyword. The second line identifies the ©grammar ruleª which the keyword may erroneously reduce. The ©Auxiliary Windowsª menu provides three auxiliary windows keyed directly to the anomaly to help you determine the nature of the problem: The ©Keyword Anomaly Traceª window, the ©Reduction Traceª window, and the ©Rule Derivationª window. Three other windows provide supporting information: the ©Reduction Statesª window, the ©Rule Contextª window and the ©State Definitionª window. ## Keywords The Keywords entry in the ©Browse Menuª pops up a window which lists all of the keywords defined in your ©grammarª. The ©token numberª is also specified. A Keywords window is also an option in the ©Auxiliary Windowsª popup menu for any window which distinguishes various states of your parser. The Keywords window will show all of the ©keywordªs which will be recognized in the state selected by the cursor bar in the parent window. The ©Auxiliary Windowsª menu for a Keywords window provides a ©Token Usageª option which will allow you to all the uses of a particular keyword in your grammar. ## left "left" controls a ©precedence declarationª, indicating that all of the listed ©rule elementsª are to be considered ©left associativeª. ## Left Associative A binary operator is said to be left associative if an expression with repeated instances of the operator is to be evaluated from the left. Thus, for example, x = a/b/c is normally taken to mean x = (a/b)/c The division operator is said to be left associative. In ©grammarªs with ©conflictªs, you may use ©precedence declarationªs to specify that an operator should be left associative. ## Lexeme The "lexeme" ©attribute statementª is used to fine-tune the "©disregardª" statement. The lexeme statement takes the form: lexeme { T1, T2,....Tn } where T1,...Tn is a list of ©nonterminalª tokens separated by commas. Lexeme statements may be placed in any ©configuration sectionª, and there may be any number of them. When you specify that a ©tokenª is to be disregarded, AnaGram rewrites your ©grammarª so that the token will be passed over whenever it occurs at the beginning of a file or following a lexical unit, or "lexeme". If you have no lexeme statement, then the lexemes in your grammar are just the terminal tokens. The lexeme statement allows you to specify that certain nonterminal tokens are also to be treated as lexemes. This means that the disregard token will be skipped following the lexeme, but not between the characters that constitute the lexeme. Lexemes correspond to the tokens that a lexical scanner, if you were using one, would commonly identify and pass to a parser as single tokens. You don't usually wish to disregard ©white spaceª within these tokens. For example, in a grammar for a conventional programming language where blank characters are to be disregarded, you might include: [ lexeme {string, character constant, name, number} ] since blank characters must not be overlooked within strings and constants, and should not be permitted within names or numbers. If your grammar allows for situations where successive lexemes could run together if they were not separated by space, a name followed by a number, for example, you may use the "©distinguish lexemesª" ©configuration switchª to force a separation between the tokens. White space may be used explicitly within definitions of lexeme tokens in your grammar if desired, without causing conflicts. Thus, if you wish to allow embedded space in variable names, you might write: [ disregard space lexeme {variable name} ] space = ' ' + '\t' letter = 'a-z' + 'A-Z' digit = '0-9' variable name -> letter -> variable name, letter + digit -> variable name, space..., letter + digit ## line line is a field in your ©parser control blockª used for keeping track of the line number of the current character in your input. Line and column numbers are tracked only if the ©lines and columnsª ©configuration switchª has been set. ## line length Line length is an ©obsolete configuration parameterª. ## Line Numbers "Line numbers" is a ©configuration switchª which defaults to off. If it is on, the ©Build Parserª command will put "#line" directives into the generated C code file so that your compiler diagnostics will refer to lines in the ©syntax fileª rather than in the generated C code file. For more information on the "#line" directive, see Kernighan and Ritchie, second edition, section A12.6. If the "line numbers" switch is off, AnaGram will put comments into your parser file to help you find reduction procedures and embedded C in your syntax file. Prior to AnaGram 2.01, if your C or C++ compiler required that the backslashes in the pathname in the #line directive be doubled, you would have used AnaGram's ©escape backslashesª switch to make this happen. Although you may still use ©escape backslashesª, it should no longer be necessary because AnaGram now puts forward slashes into #line pathnames instead of backslashes. If you wish, you may specify the pathname in the #line directives explicitly by using the ©Line Numbers Pathª configuration parameter. You may also wish to change the "©parser file nameª" parameter to provide a full path name for your parser file. ## Line Numbers Path "Line Numbers Path" is a ©configuration parameterª which takes a string value. It defaults to NULL. When you have set the ©Line Numbersª ©configuration switchª and Line Numbers Path is not NULL, AnaGram uses it in the #line directive in place of the full path name of your ©syntax fileª. Note that Line Numbers Path should be the complete pathname for your syntax file. Line Numbers Path is useful when using AnaGram in cross platform development. When parsers are to be compiled and tested on a platform different from that used to run AnaGram, you may use Line Numbers Path to provide a pathname on the platform used for compiling and testing. ## Lines and Columns "Lines and columns" is a ©configuration switchª which defaults to on. When set, i.e., on, it causes the ©Build Parserª command to incorporate code into your parser which will automatically track the line number and column number of the input token. You would normally set the "lines and columns" switch when you are planning to build a parser which will read an input file and which will need to diagnose ©syntax errorsª with some precision. Your parser will store the line and column numbers in the ©lineª and ©columnª fields respectively in the ©parser control blockª. If the input to your parser includes tab characters, you should either set the ©tab spacingª ©configuration parameterª appropriately or provide a ©TAB_SPACINGª macro for your parser. Your parser will count line and column numbers beginning with one. ## Main Program The "main program" ©configuration switchª determines what AnaGram does if you invoke the ©Build Parserª command, but have no ©embedded Cª in your ©syntax fileª. If the switch is on and you have not specified ©pointer inputª or an ©event drivenª parser, AnaGram creates a main program which does nothing but call your ©parserª. The "main program" switch defaults to on. This feature, along with the default definitions for ©GET_INPUTª and ©error handlingª, makes it possible to write a grammar with no ©embedded Cª or ©reduction procedureªs whatsoever and still get an executable program which will read input from stdin and parse it according to your grammar. ## Marked Rule A "marked rule" is a ©grammar ruleª together with a marked token that indicates how much of the rule has already been matched. The ©marked tokenª and any tokens following it indicate the input that should be expected if the remainder of the rule is to be matched. When marked rules are displayed in AnaGram windows, the marked token is represented by a difference in the font. The token may be in bold face, underlined, italicized, shown with a different point size, or in a different font altogether. Since AnaGram allows you to change fonts to suit your own preferences, you should be careful that the font you choose for the marked tokens allows them to be readily distinguished from the other tokens in your grammar rules. An underlined font is often suitable. ## Max conflicts The "max conflicts" ©configuration parameterª limits the number of ©conflictªs AnaGram will record. Sometimes, a simple error editing your syntax file can cause hundreds of conflicts, which you don't need to see in gory detail. The default value of max conflicts is 50. If you have a grammar that is in serious trouble and you want to see more conflicts, you may change max conflicts to suit your needs. ## Missing The ©warningª message Missing <element 1> in <element 2> indicates that AnaGram expects to see an instance of syntactic element 1 at the specified location, internal to an instance of syntactic element 2. AnaGram cannot reliably continue parsing its input after an error of this type. Therefore, it limits further analysis of your grammar to scanning for syntax errors. ## Missing Production "Missing production, TXXX: <token name>" is a ©warningª message which indicates that the specified ©tokenª appears to be defined recursively, but there is no initial ©productionª to get the recursion started. If you get this warning, check your ©grammarª closely. ## Missing Reduction Procedure "Missing reduction procedure, RXXX" is a ©warningª message which appears either when the ©grammar ruleª indicated specifies a ©parameter assignmentª but does not have a ©reduction procedureª to use it, or when the rule has no reduction procedure but the value of the token on the left hand side is used in as an argument for some other reduction procedure and the ©default reduction valueª does not have the same type as the token on the left hand side. In this latter case, a reduction procedure may be needed to effect correct type conversion. This warning is provided in case the lack of a reduction procedure is an oversight. ## Multiple Definitions "Multiple definitions for TXXX: <token name>" is a ©warningª message which indicates that the specified ©tokenª has been defined both as a ©character setª and as a ©nonterminal tokenª. It cannot be both. ## Near Functions "Near Functions" is a ©configuration switchª that defaults to off. It controls the use of the "near" keyword for static functions in your parser. If your parser is to run on an 80x86 processor you might wish to turn it on. Your parser will then be a slight bit smaller and will run a little bit faster. If you are going to run your parser on some other processor or use a C or C++ compiler that does not support the "near" keyword you should make sure "near functions" is set to off. ## Negative Character Code in Pointer Mode This ©warningª message appears if your ©grammarª defines negative character codes and uses ©pointer inputª. If your grammar uses the default definition for ©pointer typeª it will be reading unsigned characters so that the parser will never see the negative codes that have been defined. You may correct the problem by providing your own definition of pointer type. ## Nest Comments "Nest comments" is a ©configuration switchª which defaults to off. It controls the treatment of ©commentsª while scanning your ©syntax fileª. It defaults to off, in accordance with the ANSI standard for C which disallows ©nested commentsª. Note that AnaGram scans comments in any ©embedded Cª code as well as in the grammar specification. You may turn this switch on and off as many times as necessary in a single file. ## Nested Comment As delivered, AnaGram treats C style ©commentsª according to the ANSI standard: They do not nest. For those who prefer nested comments, however, the ©nest commentsª ©configuration switchª allows them to nest. ## Nesting too deep This ©warningª message indicates that ©set expressionªs or ©virtual productionsª are nested so deeply they have exhausted the available stack space and AnaGram cannot continue its analysis. Use a ©definitionª statement to name an intermediate level. ## no cr "no cr" is a ©configuration switchª which defaults to off. When this switch is set, it will cause the ©parser fileª and ©header fileª to be written without carriage returns. This is convenient if you wish to use the generated parser files in a Unix environment. ## No Grammar Token Specified This ©warningª message appears if your ©grammarª does not specify a ©grammar tokenª. Edit your ©syntax fileª to specify one. ## No Productions in Syntax File This ©warningª message appears if AnaGram did not find any ©productionsª at all in your ©syntax fileª. Check to see you have the right file. ## No Such Parameter This ©warningª message appears when AnaGram does not recognize the name of a ©configuration parameterª you have tried to set in your ©syntax fileª. Check the spelling of the parameter you wish to set in the ©Configuration Parameters Windowª. ## No Terminal Tokens in Expansion No terminal tokens in expansion of TXXX is a ©warningª message indicating that there are no terminal tokens to be found in an expansion of the specified token. Although there are a few circumstances where this could be legitimate, it is more likely that there is a missing rule in the grammar. ## Not a Character Set "Not a character set, TXXX: <token name>" is a ©warningª message which indicates that the specified ©tokenª has been used both on the left side of a ©productionª and in a ©character setª expression defining some other token. AnaGram will use an empty set in place of the specified token in evaluating the ©character setª. You will get another warning, ©Error definingª token, when AnaGram finishes its evaluation of the character set. ## Nothing Reduces "Nothing reduces TXXX -> RYYY" is a ©warningª message which indicates that the ©grammarª does not specify any input to follow an instance of the indicated ©grammar ruleª. In all probability, the grammar does not have any explicit end of file, or ©eof tokenª. If the grammar does not have any conflicts with ©tokenª T000, then an explicit end of file indicator is not necessary. Otherwise you should modify your grammar to require an explicit end of file. ## Null Character in String This ©warningª message appears when AnaGram finds an explicit null character in a quoted string. If you must allow for a null in a ©keyword stringª you will have to rewrite your ©grammar ruleª. For instance, instead of widget -> "abc\0def" write widget -> "abc", 0, "def" ## nonassoc "nonassoc" controls a ©precedence declarationª, indicating that all of the listed ©rule elementsª are to be considered non-associative. ## Nonterminal Token, Nonterminal A nonterminal token is one which is constructed from a series of other tokens as specified by one or more ©productionªs. Nonterminal tokens are to be distinguished from ©terminal tokenªs, which are the basic input units appearing in your input stream. Terminal tokens most often represent single characters or a character belonging to a ©character setª such as 'a-z'. ## Null Production A "null production" is one that has no tokens on the right hand side whatsoever. Null ©productionªs essentially are identified by the first following input token. Null productions are extremely convenient syntactic elements when you wish to make some input optional. For example, suppose that you wish to allow an optional semicolon at some point in your grammar. You could write the following pair of productions: optional semicolon -> | ';' Note that a null production can never follow a '|'. This could also be written on multiple lines thus: optional semicolon -> -> ';' You can always rewrite your grammar to eliminate null productions if you wish, but you usually pay a price in conciseness and clarity. Sometimes, however, it is necessary to do such a rewrite in order to avoid ©conflictªs, to which null productions are especially prone. For example suppose you have the following production: foo -> wombat, optional semicolon, widget You can rewrite this as two productions: foo -> wombat, widget -> wombat, ';', widget This rewrite specifies exactly the same input language, but is less prone to conflicts. On the other hand, it may require significantly more table space in your parser. If you have a null production with no ©reduction procedureª specified, your parser will automatically assign the value zero to ©reduction tokenª. Null productions can also be generated by ©virtual productionsª. A token that has a null production is a "©zero lengthª" token. ## Old Style "Old Style" is a ©configuration switchª which defaults to off. It controls the function definitions in the code AnaGram generates. When "old style" is off, it generates ANSI style calling sequences with prototypes as necessary. When "old style" is on, it generates old style function definitions. ## Output Files When you use the ©Build Parserª command, to request output from AnaGram, it creates two files: a ©parser fileª and a ©parser headerª file. ## Page Length "Page length" is an ©obsolete configuration parameterª. ## Obsolete Configuration Parameter, Obsolete Configuration Switch A number of ©configuration parameterªs and ©configuration switchªes which were used in the DOS version of AnaGram are no longer used, but are still recognized for the sake of upward compatibility. These parameters include: ©bottom marginª ©line lengthª ©page lengthª ©top marginª ©quick referenceª ©video modeª ## Parameter "Parameter <name> has type void" is a ©warningª message which appears when a ©parameter assignmentª is attached to a ©tokenª that has been defined to have the void ©data typeª. ## Parameter Assignment In any ©grammar ruleª, the ©semantic valueª of any ©rule elementª may be passed to a ©reduction procedureª by means of a parameter assignment. Simply follow the rule element with a colon and a C variable name. The C variable name can then be used in the reduction procedure to reference the semantic value of the token it is attached to. AnaGram will automatically provide necessary declarations. Here are some examples of rule elements with parameter assignments: '0-9':d integer:n expression:x declaration : declaration_descriptor ## Parameter Not Defined AnaGram does not have a ©configuration parameterª with the specified name. Please check the spelling. ## Parameter Takes Integer Value The specified ©configuration parameterª takes an integer value only. ## Parameter Takes String Value The specified ©configuration parameterª takes a string value only. ## Parse Function To run your parser, you call the parse function. The name of the parse function is given by the ©parser nameª ©configuration parameterª and defaults to the name of your parser file. If your parser uses ©pointer inputª, you should set the ©pointerª field of the ©parser control blockª before calling the parser function. If your parser is ©event drivenª, you should first call the ©initializerª, and then you should call the parser function for each input token you If the ©reentrant parserª switch is set, the parse function takes a pointer to the ©parser control blockª as its sole argument. Otherwise it takes no arguments. The parse function returns no value. All communication is by means of the ©parser control blockª. To retrieve the value of the ©grammar tokenª, once the parse is complete, use the ©parser value functionª. ## Parser A parser is a program or, more commonly, a procedure within a program, which scans a sequence of ©input charactersª or input tokens and accumulates them in an input buffer or stack as determined by a set of ©productionªs which constitute a ©grammarª. When the parser discovers a sequence of tokens as defined by a ©grammar ruleª, or right hand side of a production, it "reduces" the sequence to a single ©reduction tokenª as defined by the left hand side of the grammar rule. This ©nonterminal tokenª now replaces the tokens which matched the grammar rule and the search for matches continues. If an input token is encountered which will not yield a match for any rule, it is considered a ©syntax errorª and some kind of ©error recoveryª may be required to continue. If a match, or ©reduce actionª, yields the ©grammar tokenª, sometimes called the ©goal tokenª or ©start tokenª, the parser deems its work complete and returns to whatever procedure may have called it. The ©Grammar Traceª and ©File Traceª functions in AnaGram provide a convenient means for understanding the detailed operation of a syntax directed parser. ©Tokensª may have ©semantic valuesª. If the ©input valuesª ©configuration switchª is on, your parser will expect semantic values to be provided by the input process along with the token identification code. If the input values switch is off, your parser will take the ascii value of the input character, that is, the actual input code, as the value of the character. When the parser reduces a production, it can call a ©reduction procedureª or ©semantic actionª to analyze the values of the constituent tokens. This reduction procedure can then return a value which characterizes the reduced token. ## Parser Control Block A "Parser Control Block" is a structure which contains all of the data necessary to describe the instantaneous state of a parser. The typedef statement which defines the structure is included in the ©parser headerª file for your parser. AnaGram creates the name of the data type for the structure by appending "_pcb_type" to the ©parser nameª. You may add your own declarations to the parser control block by using the ©extend pcbª statement. If the ©declare pcbª ©configuration switchª is on, its normal state, AnaGram will declare a parser control block for you at the beginning of your parser file. AnaGram will determine the name of the parser control block by appending "_pcb" to the ©parser nameª. AnaGram will also define the macro PCB as a short hand notation for use within the parser. All references to the parser control block within the code that AnaGram generates are made using the PCB macro. If you wish to declare your own parser control block, you must include the ©parser headerª file for your parser before your declaration. Then you declare a control block and define PCB to refer to the control block you have declared. Suppose your grammar is called widget. You would then write the following statements in your ©embedded Cª: #include "widget.h" widget_pcb_type widget_control_pcb; #define PCB widget_control_pcb Alternatively, you could write the following: #include "widget.h" widget_pcb_type *widget_control_pcb_pointer; #define PCB (*widget_control_pcb) and then allocate storage for the structure when necessary. Some fields of interest in the parser control block are as follows: ©input_codeª ©input_valueª ©input_contextª ©pointerª ©token_numberª ©reduction_tokenª ©ssxª ©snª ©ssª[©parser stack sizeª] ©vsª[parser stack size]; ©csª[parser stack size]; ©lineª ©columnª *©error_messageª ©error_frame_ssxª ©error_frame_tokenª ## PCB "PCB" is a macro AnaGram defines for use in the code it generates to refer to the ©parser control blockª for your ©parserª. Normally, AnaGram automatically declares storage for a parser control block and defines PCB for you. If you turn off the ©declare PCBª switch, you may define PCB yourself. ## PCB_TYPE If you are writing your parser in C++, you may prefer to derive a class from the ©parser control blockª rather than use the ©extend pcbª statement. In this case you may define the PCB_TYPE macro in your syntax file to specify your derived class. For instance, you have defined class MyPcb : public parser_pcb_type {...}; You would then add the following line: #define PCB_TYPE MyPcb If you do not define PCB_TYPE, AnaGram will define it as the type of your parser control block. ## Parser File The "parser file" is the C (or C++) file output by AnaGram when you execute the ©Build Parserª command. It contains all of the ©embedded Cª from your ©syntax fileª, all of the ©reduction procedureªs defined in your ©grammarª, syntax tables which represent, in a condensed form, all of the intricacies of your grammar, and a customized ©parsing engineª. The name of the parser file is given by the ©parser file nameª ©configuration parameterª. The name of the ©parserª itself is given by the ©parser nameª configuration parameter. If you wish the parser file to be written without carriage returns, suitable for a Unix environment, set the ©no crª configuration switch. ## Parser File Name "Parser file name" is a ©configuration parameterª which takes a string value. The default value is "#.c". AnaGram uses this parameter to generate the name of the output C file, or ©parser fileª, created by the ©Build Parserª command. The '#' character is used in this string as a wild card to indicate the name of the current ©syntax fileª. If the first character of the parser file name string is a '.' character, AnaGram will substitute the name of the current working directory for the dot. Thus ".\\#.c" will create the file name as a complete path. This can sometimes be important when using the ©line numbersª switch to enable a debugger to find code in your parser file. Note that the parser file name is not the same as the ©parser nameª. ## Parser Generator A parser generator, such as AnaGram, is a program that converts a ©grammarª, a rule-based description of the input to a program, into a conventional, procedural module called a ©parserª. The parsers AnaGram generates are simple C modules which can be compiled on almost any platform. AnaGram parsers are also compatible with C++. ## Header File, Parser Header When you use the command ©Build Parserª to generate source code for a parser, AnaGram creates two files, a header file and a C source file. Unless different paths are specified in the ©parser file nameª and ©header file nameª parameters, both files will be written to the directory that contains the ©syntax fileª. The header file contains a number of typedef statements, including the definition of the ©parser control blockª, and a number of macro definitions which may be useful in your parser or in other modules of your program. If you do not alter the ©header file nameª parameter, the name of the header file will be the same as the name of your ©syntax fileª and it will have the extension ".h". If you wish the header file to be written without carriage returns, suitable for a Unix environment, set the ©no crª configuration switch. ## Parser Input AnaGram ©parserªs may be configured to accept input in any of three different ways: By default, a ©parse functionª gets its input by invoking the ©GET_INPUTª macro each time it is ready for another input token. The default implementation of GET_INPUT reads ©input characterªs from stdin. For most practical problems, you will want to override this definition of GET_INPUT, storing the current input character in PCB.input_code. Alternatively, you may configure a parser to read input from an array in memory. Set the ©pointer inputª switch and load the ©pointerª field of the parser control block before calling the parse function. The parser will then run, incrementing the pointer, until it finishes or encounters an error. The third alternative is to set the ©event drivenª switch. The parser will be configured as a callback routine. Begin by calling the ©initializerª. Then, for each input character, store the character in the ©input_codeª field of the parser control block and call the parse function. Each time you call the parse function it will continue until it needs more input. You can check its status by inspecting the ©exit_flagª in the parser control block. The input to your parser may be either text characters or ©tokensª accumulated by a pre-processor, or ©lexical scannerª. The latter case is referred to as ©token inputª. If you use a lexical scanner, you may find it convenient to configure your parser as event driven. Altlhough lexical scanners are often not necessary when you use AnaGram, if you do need one you can write it in AnaGram. ## Parser Name "Parser Name" is a ©configuration parameterª which defaults to "#", where "#" represents the name of your ©syntax fileª. AnaGram uses this parameter to name your ©parse functionª. The ©initializerª for your parser will have the same name preceded by "init_". Note that "©parser file nameª" is not the same configuration parameter as "parser name". ## Parser Stack Your ©parserª uses a "parser stack" to keep track of the ©grammar rulesª it is trying to match and its progress in matching them. Normally, there are two separate stacks defined by AnaGram: ©PCBª.©ssª, the ©parser state stackª which maintains ©parser stateª numbers, and PCB.©vsª, the ©parser value stackª which maintains the ©semantic valueªs of tokens that have been identified so far. If you wish to maintain a stack tracking other variables you may set the ©context typeª ©configuration parameterª, and AnaGram will define a third stack, PCB.©csª. All are indexed by the same stack index, PCB.©ssxª. To see how tokens accumulate on the parser stack, run the ©Grammar Traceª or the ©File Traceª. Normally, when the return value of a ©reduction procedureª is stored on the parser value stack, it is stored by simply coercing the stack pointer to the correct type. If the return value is a C++ object, this can cause serious problems. These problems can be avoided by using the ©wrapperª statement. ## Parser stack alignment Parser stack alignment is a ©configuration parameterª whose value is a C or C++ data type. It defaults to "long". If any tokens have type "double", it will be automatically set to double. Thus, you will normally not need to change this parameter if your parser is to run on a PC or compatible processor. It provides alignment control for processors which restrict address for multibyte data access. The default setting provides for correct operation on 64 bit processors. To control byte alignment of the parser stack, ©PCBª.©vsª, AnaGram normally adds a field of the specified data type to the "union" statement which defines the data type for the ©parser stackª. This parameter can be used to deal with byte alignment problems when a ©parserª is to be run on a processor with byte alignment restrictions. For instance, if your ©grammarª has ©tokenªs of type "long double" and your processor requires long double variables to be properly aligned, you can include the following statement in a ©configuration sectionª in your grammar or in your ©configuration fileª: parser stack alignment = long double If the data type specified is "void", no alignment declaration will be made. ## Parser Stack Index, Stack Index The parser stack index, ©PCBª.©ssxª, tracks the depth of the ©parser state stackª, the ©parser value stackª, and the ©context stackª if you defined one. The parser stack index is incremented by ©shift actionsª and reduced by ©reduce actionsª. ## Parser Stack Overflow Your ©parserª uses a ©parser stackª to keep track of the ©grammar rulesª it is trying to match and its progress in matching them. If your grammar has any ©recursive ruleªs that are not strictly left recursive, then no matter how big you make the parser stack, it will be possible to create a syntactically correct input which will cause the stack to overflow. As a practical matter, however, it is usually possible to set the ©parser stack sizeª to a value large enough so that an overflow is a freak occurrence. Nevertheless, it is necessary to check for overflow, and in the case overflow should occur, your parser has to do something. What it does is invoke the ©PARSER_STACK_OVERFLOWª macro. If you don't define it, AnaGram will define it for you, although not necessarily to your taste. ## Recursive rule, Recursion A ©grammar ruleª is said to be "recursive" if the ©tokenª on the left side of the rule also appears on the right side of the rule, or in an ©expansion ruleª of any token on the right side of the rule. If the token on the left side is the first token on the right side, the rule is said to be "left recursive". If it is the last token on the right side, the rule is said to be "right recursive". Otherwise, the rule is "center recursive". For example: statement list -> statement -> statement list, statement // left recursive fraction part -> digit -> fraction part, digit // right recursive expression -> factor -> expression, '+' + '-', factor factor -> primary -> factor, '*' + '/', primary primary -> number -> name -> '(', expression, ')' // center recursive Note that if all the tokens in the rule other then the recursive token itself are ©zero lengthª tokens, it is possible for the rule to be matched arbitrarily many times without any input whatsoever. In other words, such a rule creates an infinite loop in the parser. AnaGram can detect this condition and issues an ©empty recursionª diagnostic if it occurs. ## PARSER_STACK_OVERFLOW PARSER_STACK_OVERFLOW is a user definable macro. If you do not define it, AnaGram will define it so that it will print a message on stderr and abort the ©parserª in case of a ©parser stack overflowª. ## Parser Stack Size "Parser stack size" is a ©configuration parameterª with a default value of 128. It is used to define the sizes of your ©parser stacksª in your ©parser control blockª. When analyzing your grammar, AnaGram will determine the minimum amount of stack space required for the deepest left ©recursionª. To this depth it will add one half the value of the parser stack size parameter. It will then set the actual stack size to the larger of this value and the parser stack size parameter. ## Parser State, State Number The essential part of your ©parserª is a group of tables which describe in detail what to do for each "state" of the parser. The states of a parser are determined by sets of "©characteristic rulesª". The ©State Definition Tableª shows the characteristic rules for each state of your parser. AnaGram numbers the states of a parser as it identifies them, beginning with zero. In all windows, state numbers are displayed as three digit numbers prefixed with the letter 'S'. ## Parser State Stack, State Stack The parser state stack is a stack maintained by your ©parserª and which is an integral part of the parsing process. At any point in the parse of your input stream, the parser state stack provides a summary of what has been found so far. The parser state stack is stored in ©PCBª.©ssª and is indexed by PCB.©ssxª, the ©parser stack indexª. ## Parser Value Stack, Value Stack In parallel with the ©parser state stackª, your parser maintains a "value stack", ©PCBª.©vsª, each entry of which corresponds to the ©semantic valueª of the token identified at that state. Since the semantic values of different tokens might well have different ©data typeªs, AnaGram gives you the opportunity, in your ©syntax fileª, to define the data type for any token. AnaGram then builds a typedef statement creating a data type which is a union of the all the types you have defined. AnaGram creates the name for this ©data typeª by appending "_vs_type" to the ©parser nameª. AnaGram uses this data type to define the value stack. ## Parser Action In a traditional LR parser, there are only four actions: the ©shift actionª, the ©reduce actionª, the ©accept actionª and the ©error actionª. AnaGram, in doing its ©grammar analysisª, identifies a number of special cases, and creates a number of extra actions which make for faster processing, but which can be represented as combinations of these primitive actions. When a shift action is performed, the current state number is pushed onto the ©parser state stackª and the new state number is determined by the current state number and the current input token. Different tokens cause different new states. When a reduce action is performed, the length of the rule being reduced is subtracted from the ©parser stack indexª and the new state number is read from the top of the parser state stack. The ©reduction tokenª for the rule being reduced is then used as an input token. ## Parsing Engine A parser consists of three basic components: A set of syntax tables, a set of ©reduction procedureªs and a parsing engine. The parsing engine is the body of code that interprets the parsing table, invokes input functions, and calls the reduction procedures. The ©Build Parserª command configures a parsing engine according to the implicit requirements of the syntax specification and according to the explicit values of the ©configuration parameterªs. The parsing engine itself is a simple automaton, characterized by a set of states and a set of inputs. The inputs are the tokens of your grammar. Each state is represented by a list of tokens which are admissible in that state and for each token a ©parser actionª to perform and a parameter which further defines the action. Each state in the grammar, with the exception of state zero, has a ©characteristic tokenª which must have been recognized in order to jump to that state. Therefore, the ©parser state stackª, which is essentially a list of state numbers, can also be thought of as a list of token numbers. This is the list of tokens that have been seen so far in the parse of your input stream. ## Partition If you use ©character setsª in your grammar, AnaGram will compute a "partition" of the ©character universeª. This partition is a collection of non-overlapping character sets such that every one of the sets you have defined can be written as a ©unionª of partition sets. Each partition set is assigned a unique ©tokenª. If one of your character sets requires more than one partition set to represent it, AnaGram will create appropriate ©productionªs and add them to your grammar so your parser can make the necessary distinctions. To see how AnaGram has partitioned the character universe, you may inspect the ©Partition Setsª window found in the ©Browse Menuª. ## Partition Set Number Each ©partitionª set is identified by a unique reference number called the partition set number. Partition set numbers are displayed in the form Pxxx. Partition sets are numbered starting with zero, so the first set is P000. To see the elements of a given partition set, call up the ©Partition Setsª window from the ©Browse Menuª, then, after selecting a partition set, call up the ©Set Elementsª window from the ©Auxiliary Windowsª popup menu. ## Partition Sets The Partition Sets option in the ©Browse Menuª pops up a window which shows the complete ©partitionª of the ©character universeª for your parser. The Partition Sets option in the ©Auxiliary Windowsª popup menu for the ©Character Setsª window lets you see the partition sets which cover the specified character set. Each entry in a Partition Sets window identifies a token number and a ©partition set numberª. The ©Auxiliary Windowsª menu provides a ©Set Elementsª entry which enables you to see precisely which characters belong to the partition set. It also has a Token Usage entry to show you what rules the set is used in. ## PCONTEXT PCONTEXT is an alternate form of the ©CONTEXTª macro which takes an explicit argument to specify the ©parser control blockª. PCONTEXT is defined in the ©parser headerª file. ## PERROR_CONTEXT PERROR_CONTEXT is an alternative form of the ©ERROR_CONTEXTª macro. It differs only in that it takes an argument so you can specify the appropriate ©parser control blockª explicitly. PERROR_CONTEXT is defined in the ©parser headerª file. ## pointer "pointer" is a field which will be included in the ©parser control blockª for your parser if you have set the ©pointer inputª ©configuration switchª. Your main program should set PCB.pointer before it calls your parser. Thereafter, your parser will increment it appropriately. When you are executing a ©reduction procedureª or a ©SYNTAX_ERRORª macro PCB.pointer will always point to the next input character to be read. ## Pointer input "Pointer input" is a ©configuration switchª which you may set to control ©parser inputª. It defaults to off. When you set pointer input, you tell AnaGram that the input to your parser is in memory and can be scanned simply by incrementing a pointer. Before calling your parser you should make sure that ©PCBª.©pointerª is properly initialized to point to the first character or token in your input. Use the ©configuration parameterª "©pointer typeª" to specify the type of the pointer. The default value of "pointer type" is "unsigned char *" There is no particular reason why pointer type should be limited to variants on char. It could define a pointer to int or a structure just as well. If you use pointer input with structures or C++ classes, you should set the ©input valuesª switch and define an ©INPUT_CODEª(t) macro. If you are using a 16 bit compiler and your input array is so large that you need "huge" pointers, make sure that "pointer type" is properly defined. ## Pointer Type "Pointer Type is a ©configuration parameterª which defaults to "unsigned char *". When you have specified ©pointer inputª, AnaGram uses the value of pointer type to declare a pointer field in your ©parser control blockª. ## Precedence, Operator Precedence In expressions of the form a+b*c, the convention is to perform the multiplication before the addition. Multiplication is said to take precedence over addition. In general the rank order in which operations are to be performed if there are no parentheses forcing an order of computation is called the precedence of the operators. If you have an ambiguous ©grammarª, that is, a grammar with a number of ©conflictªs, you may use ©precedence declarationªs to resolve the conflicts and to set operator precedence. ## Precedence Declaration Precedence declarations are ©attribute statementsª which may be used to resolve ©conflictªs in your grammar by assigning precedence and associativity to operators. Precedence declarations must be made inside ©configuration sectionsª. Each declaration consists of the keyword ©leftª, ©rightª, or ©nonassocª followed by a list of ©rule elementsª. The rule elements in the list must be separated by commas and the entire list must be enclosed in braces ({ }). Each of the rule elements is assigned the same precedence level, which is higher than that assigned in all previous precedence declarations and lower than that in all subsequent declarations. The rule elements are defined to be left, right, or nonassociative, depending on whether the keyword was "left", "right", or "nonassoc". All conflicts which are resolved by precedence declarations are listed in the ©Resolved Conflictsª window. ## Precedence Rules AnaGram can resolve certain types of ©conflictªs in your grammar by applying precedence rules. There are three classes of rules available: explicit ©precedence declarationsª, the "©stickyª" statement, and the implicit rule associated with the use of a "©disregardª" token outside a ©lexemeª. Whenever AnaGram uses a precedence rule of any kind to resolve a conflict, it produces a ©warningª message and lists the conflict in the ©Resolved Conflictsª window. ## Previous States The Previous States window can be accessed via the ©Auxiliary Windowsª popup menu from any window that identifies ©parser stateªs. It shows the ©characteristic ruleªs for all of the states which jump to the presently selected state. ## Print File Name "Print file name" is a configuration parameter which is not used in the Windows version of AnaGram. It is retained only for compatibility with pre-existing ©configuration fileªs. ## Problem States The Problem States window is essentially a trimmed version of the ©Reduction Statesª window. It is available in the ©Auxiliary Windowsª popup menu for the ©Conflictsª and ©Resolved Conflictsª windows. The Problem States window has the same format as the Reduction States window, and differs only in that it shows only those reduction states for which the ©conflict tokenª is acceptable input. ## Production Productions are the mechanism you use to describe how complex input structures are built up out of simpler ones. Each production has a left hand side and a right hand side. The right hand side, or ©grammar ruleª, is a sequence of ©rule elementsª, which may represent either ©terminal tokensª or ©nonterminal tokensª. The left hand side is a list of ©reduction tokensª. In most cases there would be only a single reduction token. Productions with more than one ©tokenª on the left hand side are called ©semantically determined productionsª. The "->" symbol is used to separate the left hand side from the right hand side. If you have several productions with the same left hand side, you can avoid rewriting the left hand side either by using '|' or by using another "->". A ©null productionª, or empty right hand side, cannot follow a '|'. Productions may be written thus: name -> letter -> name, digit This could also be written name -> letter | name, digit In order to accommodate semantic analysis of the data, you may attach to any grammar rule a ©reduction procedureª which will be executed when the rule is identified. Each token may have a ©semantic valueª. By using ©parameter assignmentªs, you may provide the reduction procedure with access to the semantic values of tokens that comprise the grammar rule. When it finishes, the reduction procedure may return a value which will be saved on the ©parser value stackª as the semantic value of the ©reduction tokenª. ## Productions The ©Productionªs window is available via the ©Auxiliary Windowsª popup menu in any window which identifies tokens. If the token identified by the highlighted line is ©nonterminalª, the Productions window will show the rules produced by that ©tokenª. ## PRULE_CONTEXT PRULE_CONTEXT is an alternative form of the ©RULE_CONTEXTª macro. It differs only in that it takes an argument so you can specify the appropriate ©parser control blockª explicitly. PRULE_CONTEXT is defined in the ©parser headerª file. ## Quick Reference "Quick reference" is an ©obsolete configuration switchª. ## Range Bounds Out of Order This is a ©warningª message that appears when you have a ©character rangeª of the form 'z-a'. AnaGram interprets this range as being equal to 'a-z', but provides a warning in case the unusual order was the result of a clerical error. ## Recursive Definition of Char Set This ©warningª appears when AnaGram discovers a recursively defined ©character setª. Character sets cannot be defined recursively. ## Redefinition "Redefinition of <name>" is a ©warningª message which appears when AnaGram discovers a redefinition of a ©symbolª. The new ©definitionª is ignored. ## Redefinition of Grammar Token This ©warningª appears when AnaGram encounters a new definition of the ©grammar tokenª. AnaGram discards the old definition. The last definition in the syntax file wins. If you get this warning, check your ©syntax fileª to make sure you have the grammar token you want. ## Redefinition of token "Redefinition of token, TXXX: <name>" is a ©warningª message which occurs when AnaGram encounters a ©definitionª statement and the specified ©grammar tokenª has already been seen on the left side of a ©productionª. AnaGram will ignore the definition statement. ## Reduce Action, Reduction The reduce action, or reduction, is one of the four actions of a traditional ©parsing engineª. The reduce action is performed when the parser has succeeded in matching all the elements of a ©grammar ruleª, and the next input token is not erroneous. Reducing the grammar rule amounts to subtracting the length of the rule from the ©parser stack indexª, identifying the ©reduction tokenª, stacking its ©semantic valueª and then doing a ©shift actionª with the reduction token as though it had been input directly. ## Reduce-Reduce Conflict A grammar has a "reduce-reduce" ©conflictª at some state if a single token turns out to be a ©reducing tokenª for more than one ©completed ruleª. ## Reducing Token In a ©parser stateª with more than one ©completed ruleª, your parser must be able to determine which one was actually found. Therefore, during analysis of your grammar, AnaGram examines each completed rule in order to determine all the states the ©parserª will branch to once the rule is reduced. These states are called the "reduction states" for the rule. In any window that displays ©marked ruleªs, these states may be found in the ©Reduction Statesª window listed in the ©Auxiliary Windowsª popup menu. The acceptable input tokens for those states are the "reducing tokens" for the completed rules in the state under investigation. If there is a single token which is a reducing token for more than one rule, then the grammar is said to have a ©reduce-reduce conflictª at that state. If in a particular state there is both a ©shift actionª and a ©reduce actionª for the same token the grammar is said to have a ©shift-reduce conflictª in that state. Note that a "reducing token" is not the same as a "©reduction tokenª". ## Reduction Choices "Reduction choices" is a ©configuration switchª which defaults to off. If it is set, AnaGram will include in your ©parser fileª a function which will identify the acceptable choices for ©reduction tokenª in the current state. This function, of course, is useful only if you are using ©semantically determined productionsª. The prototype of this function is: int $_reduction_choices(int *); where '$' represents the name of your parser. You must provide an integer array whose length is at least as long as the maximum number of reduction choices you might have. The function will fill the array with the token numbers of those which are acceptable in the current state and will return a count of the number of acceptable choices it found. ## reduction_token "reduction_token" is a field in your ©parser control blockª. If your grammar uses ©semantically determined productionsª, your ©reduction procedureªs need a mechanism to specify which token the rule is to reduce to. ©PCBª.reduction_token names the variable which contains the ©token numberª of the ©reduction tokenª. Prior to calling your reduction procedure, your parser will set this field to the token number of the default ©reduction tokenª, i.e., the leftmost syntactically correct token in the reduction token list for the production being reduced. If the reduction procedure establishes that a different reduction token is appropriate, it should store the appropriate token number in PCB.reduction_token. ## Reduction Procedures The Reduction Procedures window lists the C function prototypes for the ©reduction procedureªs in your grammar. When this window is active, the ©syntax fileª window, if visible, is synchronized with it so you can see the body of the reduction procedure as well as its usage. ## REDUCTION_TOKEN_ERROR REDUCTION_TOKEN_ERROR is a user definable macro which your ©parserª invokes when it encounters an inadmissible reduction token. This error should occur only if your parser uses ©semantically determined productionsª and your ©reduction procedureª provides an incorrect ©token numberª. If you do not define it, AnaGram will define it so that it will print an error message on stderr and abort the parse. ## Reduction Procedure, Semantic Action A "reduction procedure", or "semantic action", is a function you write which your ©parserª executes when it has identified the grammar rule to which the reduction procedure is attached in your grammar. When your parser has identified a particular ©grammar ruleª, that is to say, a particular sequence of ©tokensª that you have specified in your grammar, it "reduces" the production to the token at the head of the production, or ©reduction tokenª. If you choose, you can specify a "reduction procedure" which your parser will call so that your program can do semantic analysis on the production just identified. Your reduction procedure will be called using, as arguments, the ©semantic valuesª of tokens on the right side of the production. Your reduction procedure may, if you choose, return a value which will become the semantic value of the reduction token. Since many of the tokens in ©productionªs are there for only syntactic purposes, you may specify, when you write your grammar, the tokens whose values are needed as arguments for your reduction procedure. To attach a reduction procedure to a grammar rule, just write it immediately following the rule. There are two formats for reduction procedures, depending on the size and complexity of the procedure. The first form consists of an equal sign followed by a C expression and a semicolon. When the rule is matched the expression will be evaluated and its value will be stacked on the ©parser value stackª as the value of the reduction token. For example: =-a; =myProcedure(x, q); The second form consists of an equal sign followed by a block of C code enclosed in curly braces. If you wish to return a value for the reduction token you have to use a return statement. For example: ={ if (x > y) return x; return x+2y; } In both forms of the reduction procedure, ©parameter assignmentªs may be attached to ©rule elementªs in order to make their semantic values available to the reduction procedure. When the reduction procedure is executed, local variables will defined with the names specified in the parameter assignments. The values of these variables will have been set to the value of the corresponding token. If the return value of your reduction procedure is a C++ object, you may wish to spacify that AnaGram enclose it in a ©wrapperª so that constructor calls and destructor calls are made. Otherwise the object pushed onto and popped from the parser value stack simply by coercing the stack pointer to the appropriate type. The reduction procedures in your grammar are summarized in the ©Reduction Proceduresª window. ## Reduction States The Reduction States window can be accessed via the ©Auxiliary Windowsª popup menu from any window which displays ©parser stateª numbers and ©marked ruleªs. If the highlighted ©grammar ruleª has no marked token, the Reduction States window will show the states the parse could reach by reducing the rule and processing the resultant ©reduction tokenª. ## Reduction Token A ©tokenª which appears on the left hand side of a ©productionª is called a reduction token. It is so called because when the ©grammar ruleª on the right side of the production is matched in the input stream, your ©parserª will "reduce" the sequence of tokens which matches the rule by replacing the sequence of tokens with the reduction token. If more than one reduction token is specified, the production is called a ©semantically determined productionª and your ©reduction procedureª should choose the appropriate reduction token. If it does not, your parser will use the first token in the list that is syntactically correct as the default. The ©CHANGE_REDUCTIONª macro can be used to specify the reduction token. Note that a "reduction token" is not the same as a "©reducing tokenª". ## Reduction Trace The Reduction Trace window is available from the ©Conflictsª window and the ©Resolved Conflictsª window. It can be used in conjunction with the ©Conflict Traceª to study ©conflictªs. The Reduction Trace represents the result of taking the reduce option in the conflict state of the Conflict Trace. ## Reentrant Parser "Reentrant parser" is a ©configuration switchª which defaults to off. If it is on when AnaGram builds a parser AnaGram will generate code that passes the pointer to the ©parser control blockª via calling sequences, rather than using static references to the pcb. You can use the reentrant parser switch to help make ©thread safe parsersª. The reentrant parser switch is compatible with both C and C++. The reentrant parser switch cannot be used in conjunction with the ©old styleª switch. When you have enabled the reentrant parser switch, the ©parse functionª, the ©initializerª function, and the ©parser value functionª will be defined to take a pointer to the parser control block as their sole argument. ## Reload Button The ©File Traceª window includes a reload button to allow you to reread your ©test fileª after you have modified it without having to start a new file trace. After the file has been reread, the file trace is reset. ## rename macro AnaGram uses a number of macros in its generated code. It is possible, therefore, to run into naming collisions with other components of your program. The rename macro ©attribute statementª allows you to change the name AnaGram uses for a particular macro to avoid these problems. For example, in the Microsoft Foundation Classes, V4.2, there is a class called "CONTEXT". If you use the ©context stackª option in AnaGram, your ©parserª will have a macro called ©CONTEXTª. To avoid the name collision, add the following attribute statement to any configuration section in your grammar: rename macro CONTEXT AG_CONTEXT Then, simply use "AG_CONTEXT" where you would otherwise have used "CONTEXT". ## reserve keywords "reserve keywords" is an ©attribute statementª which can be used to specify a list of ©keywordªs that are reserved and cannot be used except as explicitly specified in the grammar. In particular this switch enables AnaGram to avoid issuing meaningless ©keyword anomalyª warnings. AnaGram does not automatically presume that keywords are also reserved words, since in many grammars there is no need to specify reserved words. Reserve keywords statements must be made inside ©configuration sectionsª. Each statement consists of the keyword "reserve keywords" followed by a list of keyword ©tokensª. The tokens must be separated by commas and the list must be enclosed in braces ({ }). Each keyword listed will then be treated as a reserved word. ## Reset Button The Reset button, found on ©File Traceª and ©Grammar Traceª windows restores the initial configuration of the trace. This is especially convenient for ©Conflict Traceª or other ©Auxiliary Traceªs. ## Resolved Conflicts AnaGram creates the Resolved Conflicts window only when the grammar it is analyzing has ©conflictªs and when those conflicts have been resolved by ©precedence declarationªs, by "©stickyª" statements, or in connection with the explicit use of a token specified in a ©disregardª statement. The Resolved Conflicts window shows the conflicts that have been resolved, using the same format as that of the ©Conflictsª Window. The rule chosen is marked with an asterisk in the leftmost column of the window. ## Resynchronization "Resynchronization" is the process of getting your parser back in step with its input after encountering a ©syntax errorª. As such, it is one method of ©error recoveryª. Of course, you would resynchronize only if it is necessary to continue after the error. There are several options available when using AnaGram. You could use the ©auto resynchª option, which causes AnaGram to incorporate an automatic resynchronizing procedure into your parser, or you could use the ©error token resynchronizationª option, which is similar to the technique used by YACC programmers. ## right "right" controls a ©precedence declarationª, indicating that all of the listed ©rule elementsª are to be considered ©right associativeª. ## Right Associative A binary operator is said to be right associative if an expression with repeated instances of the operator is to be evaluated from the right. Thus, for example, when '=' is used as an assignment operator x = a = b is normally taken to mean a = b followed by x = a The assignment operator is said to be right associative. In ©grammarªs with ©conflictªs, you may use ©precedence declarationªs to specify that an operator should be right associative. ## Rule Context The Rule Context window can be accessed via the ©Auxiliary Windowsª menu in any window that displays ©grammar ruleªs. AnaGram displays all occurrences in the ©grammarª of all the ©reduction tokenªs for the rule. ## RULE_CONTEXT RULE_CONTEXT is a macro you may use if you have defined a ©context stackª. In any reduction procedure, RULE_CONTEXT will be a pointer to the context value stacked before the first token of the rule being reduced. Since the context stack contains an entry for each token in the rule, you may inspect the context value for each token in the rule by subscripting RULE_CONTEXT. RULE_CONTEXT[k] is the context of the (k-1)th token in the rule. ## Rule Coverage "Rule Coverage" is the name of both a ©configuration switchª and a window. The configuration switch defaults to off. If you set it, AnaGram will include code in your ©parserª to count the number of times your parser identifies each ©grammar ruleª in your grammar. To maintain the counts, AnaGram declares, at the beginning of your parser, an integer array, whose name is created by appending "_nrc" to your ©parser nameª. The array contains one counter for each rule you have defined in your grammar. There are no entries for the auxiliary rules that AnaGram creates to deal with set overlaps or ©disregardª statements. In order to identify positively all the rules that the parser reduces, AnaGram has to turn off certain optimization features in your parser. Therefore a parser that has rule coverage enabled will run slightly slower that one with the switch off. In addition, AnaGram creates a pair of functions to write the counters to a file and to initialize the counters from a file. The names of these functions are given by appending "_write_counts" and "_read_counts" to the name of your parser. The name of the file is given by the ©coverage file nameª paramater which defaults to the name of your ©syntax fileª but with the extension ".nrc". If rule coverage is enabled, AnaGram will also enable the Rule Coverage option on the ©Browse Menuª. If you select Rule Coverage, AnaGram will initialize a ©Rule Coverageª window from the rule count file you select. AnaGram will warn you if the rule count file is older than the syntax file, since under those conditions, the coverage file might be invalid. ## Rule Derivation, Token Derivation You can use the Rule Derivation and Token Derivation windows to understand the nature of ©conflictªs in your grammar. To create these windows, open the ©Conflictsª window. Move the cursor bar to a ©completed ruleª, that is, one which has no marked token. Press the right mouse button to pop up the ©Auxiliary Windowsª menu. You may then select the Rule Derivation or the Token Derivation. The Rule Derivation window and the Token Derivation window, together, show how a ©conflictª, or ambiguity, has arisen in your grammar. Both windows contain a sequence of rules, and both begin with the same rule, the rule which is the root cause of the conflict. Each subsequent line in the rule derivation is an ©expansionª of the marked token in the previous rule. The last rule in the derivation window is the rule you selected in the Conflicts window. Thus the rule derivation window shows you how the rule involved in the conflict derives from the root. Each subsequent line in the token derivation window shows an expansion of the marked token in the previous rule. The first token of the last rule in the derivation window is the token that causes the conflict. This is the usage that is inconsistent with other usages of this token in the conflict state. The Rule Derivation and Token Derivation windows each have five auxiliary windows. The ©Rule Contextª window is keyed to the highlighted rule. the other four windows, the ©Expansion Rulesª window, the ©Productionsª window, the ©Set Elementsª window and the ©Token Usageª window are keyed to the marked token. Remember that there is no marked token on the last line of the Rule Derivation window. ## Rule Element A ©grammar ruleª is a list of "rule elements", separated by commas. Rule elements may be ©token nameªs, ©character setsª, ©keywordªs, ©immediate actionªs, or ©virtual productionsª. When AnaGram encounters a rule element for which no token presently exists, it creates one. Any rule element may be followed by a ©parameter assignmentª in order to make the ©semantic valueª of the rule element available to a ©reduction procedureª. ## Rule Number AnaGram assigns a unique rule number to each ©grammar ruleª that you specify in your grammar. Rules are numbered sequentially as they are encountered in the ©syntax fileª. AnaGram constructs rule 0 itself. Rule zero has a single ©rule elementª, the ©grammar tokenª, unless you have an ©disregardª statement in your grammar. In this case, there will be two elements. In AnaGram displays, rule numbers are displayed with a prefixed 'R' and a three digit decimal number. ## Rule Stack, Rule Stack Pane The Rule Stack pane appears across the bottom of a ©Grammar Traceª or ©File Traceª window. It provides an alternate view of the parser stack for the trace, showing, for each state, rules instead of the tokens that you see in the ©Parser Stack paneª. Because it is synched with the syntax file window, the Rule Stack makes it easy to see the relationship between the trace and your grammar. For each level of the parser stack, the Rule Stack shows the ©parser stateª number and all the active rules. The active rules at any state consist of all the ©expansion ruleªs for the state that are consistent with the input at all subsequent states. Except for the last level of the stack, each rule has a ©marked tokenª, which in the default configuration is displayed in bold, italic type. The significance of the marked token is that all tokens in the rule to the left of the marked token have already been matched in the input, and the input in subsequent levels is consistent so far with the marked token. As more input is processed, rules that are inconsistent with the new input are deleted from the display. The last level of the stack shows the current state of the parser and the rules against which the ©lookahead tokenª will be matched. At this level, there may be rules with no marked tokens. These are rules which have been matched exactly in the input. If there is more than one such rule, at the next parser step the parser will use the lookahead token to determine which rule to reduce. In the last level of the stack, marked tokens represent the input the parser expects to see. The Rule Stack pane is synched with the ©syntax fileª window if it is visible so that the rule highlighted in the Rule Stack can be seen in context in the syntax file. For rules that AnaGram generated automatically (to implement ©virtual productionsª or the ©disregardª statement). the cursor bar will move to the top of the syntax file window. The Rule Stack pane is also synched with the other panes in the trace. As you move the cursor bar in the Rule Stack, the cursor bar in the Parser Stack pane will track the stack level in the Rule Stack. In a File Trace, text will be highlighted in the ©Test Fileª pane corresponding to the selected token in the Parser Stack pane. In a Grammar Trace, the marked token in the highlighted rule will be highlighted in the ©Allowable Input paneª. Clicking the right mouse button pops up an ©Auxiliary Windowsª menu to give you more information about the highlighted rule. ## Rule Table The Rule Table lists, in numerical order, all the ©grammar ruleªs defined in your ©grammarª. Each rule is preceded by the ©nonterminalª tokens which produce it. If you are not using ©semantically determined productionªs, then there will be precisely one token line per rule. The Rule Table is synched to your ©syntax fileª to show the rule in context. ## Semantic Value, Token Value A ©tokenª generally has a "semantic value", or "token value", as well as the ©token numberª which identifies it syntactically. Each instance of the token in the input stream can have a different value. For example, you might have a token called "variable name". In one instance the variable name might be "widget" and in another, "wombat". Then "widget" and "wombat" would be the semantic values in the two instances. Another token might have numeric semantic values. You can specify the C or C++ ©data typeª of the token value. The data type of "variable name" could be "char *" where the value is a pointer to a string holding the name. There are separate default types for the values of ©terminalª and ©nonterminalª tokens. In the usual case of ordinary character input, the value of a terminal token is just the ascii character code. The value of a nonterminal token is determined by the ©reduction procedureªs attached to the rules the token produces. If there is no reduction procedure, the value of the token is the value of the first token in the rule. It should be noted that the stack operations have been implemented in such a way that a C++ object that belongs to a class for which the assignment operator has been overridden will encounter serious problems. This shortcoming will be addressed in a future version of AnaGram. Note that there is no problem with using a pointer to any C++ object. ## Semantically Determined Production A "semantically determined production" is one which has more than one ©reduction tokenª specified on the left side of the ©productionª. You would write such a production when the reduction tokens are syntactically indistinguishable. The ©reduction procedureª may then specify which of the listed reduction tokens the grammar rule is to reduce to based on semantic considerations. If there is no reduction procedure, or the reduction procedure does not specify a reduction token, the parser will use the first syntactically correct one in the list. To simplify changing the reduction token, AnaGram provides a predefined macro, ©CHANGE_REDUCTIONª. The ©semantic valueªs of all the reduction tokens for a given semantically determined production must have the same ©data typeª. ©File Traceª and ©Grammar Traceª have a ©Reduction Choices paneª which appears when a semantically determined production is invoked and you need to choose a reduction token. ## Set Elements The Set Elements window is available via the ©Auxiliary Windowsª popup menu from windows which specify character sets, partition sets or tokens. It displays the actual characters which make up the set, or which map to the specified token. For each character, the numeric code as well as its display symbol is given. ## Set Expression, Expression A set expression is an algebraic expression used to define a ©character setª in terms of individual characters, ranges of characters, or other sets of characters as constructed using ©complementsª, ©unionsª, ©intersectionsª, and ©differencesª. ## Shift Action The shift action is one of the four actions of a traditional ©parsing engineª. The shift action is performed when the input token matches one of the acceptable input tokens for the current ©parser stateª. The ©semantic valueª of the token and the current ©state numberª are stacked, the ©parser stack indexª is incremented and the state number is set to a value determined by the previous state and the input token. ## Shift-Reduce Conflict A "shift-reduce" ©conflictª occurs if in some ©parser stateª there exists a ©terminal tokenª that should be shifted, because it is legitimate input for one of the ©grammar ruleªs of the state, but should also be used to reduce some other rule because it is a ©reducing tokenª for that rule. ## sn sn is a field in a ©parser control blockª to which your ©error handlingª routines and your ©reduction procedureªs may refer. Its value is the current ©state numberª of your ©parserª. sn is modified every time your parser "shifts" (performs a ©shift actionª on) a token or reduces (performs a ©reduce actionª on) a ©productionª. ## ss ss is a field in a ©parser control blockª to which your ©error handlingª and ©reduction procedureªs may refer. It is the ©state stackª for your ©parserª. Before every ©shift actionª, the current ©state numberª, ©snª, is stored in PCB.ss[PCB.ssx], where ©ssxª is the ©parser stack indexª. PCB.ssx is then incremented. ## ssx ssx is a field in a ©parser control blockª to which your ©error handlingª routines and ©reduction procedureªs may refer. It is the ©parser stack indexª for your ©parserª. On every ©shift actionª it is incremented. On every ©reduce actionª the length of the ©grammar ruleª being reduced is subtracted from PCB.ssx. ## State Definition The State Definition window can be accessed via the ©Auxiliary Windowsª popup menu from any window that specifies states. It displays the ©characteristic rulesª that define the state. The rules are displayed with a marked token, which is the next token needed in the input if the particular ©grammar ruleª is to be matched. If the rule is a completed rule, no token will be marked. Each line contains the state number, blank if it is the same as the state number of the previous line, the ©rule numberª, and finally the ©marked ruleª. The ©State Definition Tableª, found in the ©Browse Menuª, displays the characteristic rules for all states in the ©grammarª. ## State Definition Table The State Definition Table lists, for each ©parser stateª, all of the ©characteristic rulesª which define that state. The rules are displayed with a ©marked tokenª, which is the next token needed in the input if the particular ©grammar ruleª is to be matched. If the rule is a completed rule, no token will be marked. Each line contains the state number, blank if it is the same as the state number of the previous line, the ©rule numberª, and finally the ©marked ruleª. In the ©Auxiliary Windowsª menu for many states there is a ©State Definitionª entry which provides the characteristic rules for the ©parser stateª identified by the cursor bar. ## State Expansion The State Expansion window may be accessed using the ©Auxiliary Windowsª menu from any window that identifies a particular ©parser stateª. It shows the complete set of ©expansion ruleªs for the state, consisting of the union of the set of ©characteristic ruleªs and, for each characteristic rule, the set of expansion rules for the marked token. Thus the State Expansion window shows all possible legal input to your parser in the given state. ## Sticky "Sticky" statements are ©attribute statementªs and may be used just like a ©precedence declarationª to resolve ©conflictªs. If a ©shift-reduce conflictª occurs in a state where the ©characteristic tokenª is "sticky", the shift action will always be chosen. Sticky statements must be made inside ©configuration sectionsª. Each statement consists of the keyword "sticky" followed by a list of ©tokensª. The tokens must be separated by commas and the list must be enclosed in braces ({ }). Each token will then be treated as sticky. All conflicts which are resolved by sticky statements are listed in the ©Resolved Conflictsª window. ## subgrammar Declaring a nonterminal token to be a "subgrammar" changes the way AnaGram searches for reducing tokens. Normally, if there is a completed rule in a particular state, AnaGram investigates all states to which the parser could jump on reducing the rule. It then considers all terminal tokens that are acceptable input in these states to be reducing tokens for the given rule. If this set of tokens overlaps the set of tokens for which there are shift actions, or the set of tokens which reduce a different rule, there is a ©conflictª. Now consider a particular nonterminal token T and all the rules it produces, whether directly or indirectly. What the preceding remarks mean is that in determining the reducing tokens for any of these rules, AnaGram considers not only the definition, but also the usage of T. There are circumstances when it is inappropriate to consider the usage of T. The most common example occurs when building a lexical scanner for a language such as C. In this case, you can write a complete grammar for a C token with no difficulty. But if you try to extend it to a sequence of tokens, you get scores of conflicts. This situation arises because you specify that any C token can follow another, when in actual practice, an identifier, for example, cannot follow another identifier without some intervening space or punctuation. While it is theoretically possible to write a grammar for a sequence of tokens that has no conflicts, it is not usually pretty. The subgrammar declaration resolves this problem by telling AnaGram that when it is looking for reducing tokens for any rule produced directly or indirectly by a subgrammar token, it should disregard the usage of the token and only consider usage internal to the definition of the subgrammar token, as though the subgrammar token were the start token of the grammar. The subgrammar declaration is made in a ©configuration sectionª and consists of the keyword "subgrammar" followed by a list of token names separated by commas and enclosed in braces ({ }). For example: subgrammar { name, number} ## Suspicious Production This ©warningª message appears when AnaGram finds a ©productionª of the form x -> x. There is probably a typo somewhere in your ©syntax fileª. This production causes a ©conflictª in your grammar. AnaGram leaves this production in your ©grammarª, but if you build a parser, it will never succeed in recognizing this production. ## Switch Takes on/off Values Only The specified parameter is a ©configuration switchª. The only values it may be assigned are ON and OFF. ## Symbol In writing your ©grammarª you use symbols, or names, to represent most of your ©tokensª. You may also use symbols to represent ©character setªs, ©virtual productionªs, ©immediate actionªs, or ©keywordªs. A symbol, or name, must begin with a letter or an underscore. It may then contain any number of these characters as well as digits and embedded white space (including comments). For identification purposes all adjacent white space characters within a symbol name are considered to be a single blank. Upper case and lower case letters are considered to be different. Examples: token name token/*embedded comment*/name All symbols used in your grammar are listed in the ©Symbol Tableª window found in the ©Browse Menuª. ## Symbol Table The Symbol Table lists all the symbols, or names, you used in your grammar. ©Symbolªs may be used, of course, to identify ©tokensª, ©definitionsª, ©virtual productionsª, ©immediate actionªs, or ©keywordªs. Each line in this table identifies a single symbol. The first field is the token number, if any. This is followed by the name. If the name identifies an ©expressionª or virtual production, it is followed by an equal sign and the expression or virtual production. ## Syntax Analysis Aborted This ©warningª message appears if, because of previous errors, AnaGram is unable to complete the ©Analyze Grammarª command on your ©syntax fileª. ## Syntax Directed Parsing Syntax directed parsing, or formal parsing, is an approach to building ©parsersª based on formal language theory. Given a suitable description of a language, called a ©grammarª, there are algorithms which can be used to create parsers for the language automatically. In this context, the set of all possible inputs to a program may be considered to constitute a language, and the rules for formulating the input to the program constitute the grammar for the language. The parsers built from a grammar have the advantage that they can recognize any input that conforms to the rules, and can reject as erroneous any input that fails to conform. Since the program logic necessary to parse input is often extremely intricate, programs which use formal parsing are usually much more reliable than those built by hand. They are also much easier to maintain, since it is much easier to modify a grammar specification than it is to modify complex program logic. ## Syntax Error When you specify a ©grammarª, you specify a set of input character or token sequences which your ©parserª will "recognize". Usually it is possible for there to be other sequences of input tokens which deviate from the rules set down by your grammar. Should your parser find such a sequence in its input which is not explicitly allowed for in your grammar, it is said to have found a "syntax error". The general treatment of syntax errors is called ©error handlingª, of which there are two distinct aspects: ©error diagnosisª and ©error recoveryª. AnaGram allows you to make provision for error handling to fit your needs, but should you not do so, it will provide simple default error handling. ## Statements AnaGram source files, or ©syntax fileªs, consist of the following types of statements: ©productionªs ©configuration sectionªs ©embedded Cª ©definitionªs ©token declarationªs Statements may be in any order. Each statement must begin on a new line. If a statement cannot be construed as complete, it may continue onto another line. Statements may contain spaces, tabs or comments, but may not contain blank lines. ## Syntax File Input files to AnaGram are called syntax files. The default extension for syntax files is .syn. A syntax file contains a "©grammarª" and supporting C or C++ code. The file consists of several distinct types of statements. These are ©token declarationsª, ©productionªs, ©definitionsª, ©embedded Cª, and ©configuration sectionsª. There may be as many of each as you need, in whatever order you find convenient. Each such statement begins on a new line. ## SYNTAX_ERROR SYNTAX_ERROR is a macro which your parser will invoke when it encounters a syntax error in its input stream. If you have set the ©diagnose errorsª ©configuration switchª, the static variable ©PCBª.©syntax_errorª will contain a pointer to a diagnostic message when SYNTAX_ERROR is invoked. If you have also set the ©error frameª switch, ©PCBª.©error_frame_ssxª and ©PCBª.©error_frame_tokenª will also be set appropriately. ## Tab Spacing "tab spacing" is a ©configuration parameterª which controls the expansion of tabs when AnaGram displays your source file or test files in the ©File Traceª window. The value of "tab spacing" is also used to set the default value of the ©TAB_SPACINGª macro in your parser. The default value of "tab spacing" is 8. If you prefer a different value, you should probably include an appropriate statement in your ©configuration fileª. For example: tab spacing = 2 ## TAB_SPACING If you have enabled the ©lines and columnsª switch, your parser needs to know tab spacing in order to increment the column count when it encounters a tab character. It is set up to use the value given by the TAB_SPACING macro. If you do not define TAB_SPACING in your parser, AnaGram will provide a default definition, setting it to the value of the ©tab spacingª ©configuration parameterª. ## Terminal, Terminal Token A "terminal token" is a token which does not appear on the left side of a ©productionª. It represents, therefore, a basic unit of input to your ©parserª. If the input to your parser consists of ascii characters, you may define terminal tokens explicitly as ascii characters or as sets of ascii characters. If you have a lexical scanner, or preprocessor, which produces numeric codes, you may define the terminal tokens directly in terms of these numeric codes. ## Test File Binary "Test file binary" is a ©configuration switchª which defaults to off. When it is off, and you select the ©File Traceª option, AnaGram will read your test files in "text" mode, discarding carriage return characters. When "test file binary" is on, AnaGram will read test files in "binary" mode, preserving carriage return characters. If your parser needs to recognize carriage return characters explicitly, you should turn "test file binary" on. ## Test File Mask "Test file mask" is a string-valued ©configuration parameterª which AnaGram uses to set up the file dialog for the ©File Traceª command. It defaults to "*.*". If there is a conventional file name format for the input to the ©parserª you are developing, you will probably want to set "test file mask" in a ©configuration sectionª in your ©syntax fileª so it is easier to pick out your test files. ## Test range "Test range" is a ©configuration switchª which defaults to on. When it is set, i.e., on, AnaGram will configure your parser so that it checks input characters to verify that they are within the range given by the ©character universeª before it indexes the ©token conversionª table. If range testing is not necessary for your parser, you may turn test range off and get a slight improvement in the performance of your parser. ## Thread Safe Parsers AnaGram 2.01 incorporates several changes designed to make it easier to write thread safe parsers. First, the ©parserªs generated by AnaGram 2.01 no longer use static or global variables to store temporary data. All nonconstant data have been moved to the ©parser control blockª. Second, two new features which make it substantially easier to build thread safe parsers have been added. The ©reentrant parserª switch makes the entire parser reentrant, by passing the pointer to the parser control block as an argument on all function calls. The ©extend pcbª statement allows you to add your own variable declarations to the ©parser control blockª so you can avoid references to global or static variables in your ©reduction procedureªs. Third, new support has been added for C++ classes, including the ©wrapperª statement and the ©PCB_TYPEª macro. ## token_number token_number is a field in a ©parser control blockª to which your ©error handlingª procedures and ©reduction procedureªs may refer. It contains the actual ©token numberª of the current input token. If you are supplying token numbers directly, it is the result of using the actual input character to index the ©token conversionª array, ag_tcv. ## Token Tokens are the units with which your parser works. There are two kinds of tokens: ©terminal tokensª and ©nonterminal tokensª. These latter are identified by the parser as sequences of tokens. The grouping of tokens into more complex tokens is governed by the ©grammar rulesª, or ©productionªs in your grammar. In your grammar, tokens are denoted by ©token nameªs, ©virtual productionsª, explicit ©character representationsª, ©keywordªs, ©immediate actionªs, or ©expressionªs which yield ©character setsª. ## Token Conversion By using ©character setª ©expressionªs, you may in your ©syntax fileª define a number of input characters as being syntactically equivalent. When your ©parserª gets an input character, it uses the character code to index a table called ©ag_tcvª. The value it extracts from this table is the ©token numberª for the input character. The actual character code of the input character becomes the ©token valueª. ## Token Declaration A token declaration is simply a ©productionª with no right hand side. Token declarations can be used to define the ©data typeªs of tokens. To define the data type of a token, simply put the data type in parentheses preceding the name of the token. You can use a list of tokens joined by commas, if you wish. Thus: (char *) variable name, function name could be used to specify that the ©semantic valueªs of the tokens "variable name" and "function name" are both character pointers. Of course, token types may be specified as part of any production the token generates, but sometimes, in the interest of clarity, it is advisable to group all declarations together. ## Token Name All ©nonterminal tokensª that you define in your ©grammarª by means of explicit ©productionªs must have names by which they may be referenced. Token names are ©symbolsª which represent the token syntactically in your grammar specification. ## Token Names "Token names" is a ©configuration switchª that defaults to off. If it is set, it causes AnaGram to include in the ©parser fileª a static array of character strings, indexed by token number, which provides ascii representations of token names. The name of this array is given by "<parser name>_token_names", where <parser name> is the name of the parser function as given by the value of the ©parser nameª parameter. AnaGram also defines a macro, ©TOKEN_NAMESª, which evaluates to the name of the array. The array contains strings for all grammar tokens which have been explicitly named in the syntax file as well as tokens which represent ©keywordªs or single character constants. The array is useful in creating ©syntax errorª diagnostics. Prior to version 2.01 of AnaGram, the TOKEN_NAMES array contained strings only for explicitly named tokens. If this restriction is required, set the ©token names onlyª switch. Token names are also included if the ©diagnose errorsª switch is set. ## TOKEN_NAMES "TOKEN_NAMES" is the name of a macro that AnaGram defines to provide access to a static array of character strings indexed by token number, which provides ascii representation of token names. The array is generated if any of the ©token namesª, ©token names onlyª or ©diagnose errorsª switches are ON. If ©token names onlyª is set, the array contains non-empty strings only for those tokens which are explicitly named in the syntax file. Otherwise, the array also contains strings for tokens which represent keywords or single character constants. ## token names only "Token names only" is a ©configuration switchª that defaults to off. If it is set, it will cause AnaGram to include in the parser file a static array containing the names of the tokens in your grammar. This array will include only those tokens to which you have assigned names explicitly and will not include character constants or keywords. "Token names only" takes precedence over ©token namesª. ## Token Not Used "Token not used, TXXX: <token name> is a ©warningª message which appears if AnaGram finds an unused ©tokenª in your ©grammarª. Often an unused token is the result of an oversight of some kind and indicates a problem in the grammar. ## Token Number AnaGram assigns a unique number, called the "token number" to each token in the grammar, no matter whether it is a ©terminal tokenª or a ©nonterminal tokenª. Your parser does all of its analysis of your input stream using token numbers as its primary material. You may need to know the values of token numbers that AnaGram has assigned, either so a lexical scanner can output correct token numbers, or so a ©reduction procedureª can correctly resolve a ©semantically determined productionª. To help you, AnaGram defines enumeration constants for each of the named tokens in your grammar. The definition of these constants is in the ©parser headerª file. ## Token Representation Not all of the ©tokensª in your grammar have a ©token nameª. Some of the tokens may represent ©character setsª which you spelled out explicitly, ©virtual productionsª, ©immediate actionªs, or ©keywordªs. In its analysis tables, AnaGram tries to provide a meaningful representation for tokens whenever it can. Its first choice is to use the name, if it has one. Otherwise it will use the set definition or the definition of the virtual production if one exists. If AnaGram cannot otherwise represent your token, it will resort to using the token number which it normally represents using the letter T followed by a three digit, zero-padded token number. ## Token Table The Token Table lists all the tokens of your grammar. The first field is the token number. It is followed by a flag field which is "zl" if the token is a ©nonterminal tokenª and is ©zero lengthª. If the token is nonterminal and not zero length, the flag field contains "nt". If the token is a ©terminal tokenª, the field is blank. The next field is blank unless the token has been declared ©stickyª or has had a ©precedenceª level assigned. If the token is sticky, this field will contain 's'. If a precedence level has been assigned, this field will contain the letter 'l', 'r', or 'n' to indicate associativity followed by the precedence level. Finally there is the ©data typeª of the ©semantic valueª of this token and the ©token representationª. ## Token Usage The Token Usage table may be accessed via the ©Auxiliary Windowsª menu from any window that identifies tokens. It shows all the rules in the grammar that use the token. ## Top Margin "Top margin" is an ©obsolete configuration parameterª. ## Trace Coverage Trace Coverage is a table which is built whenever you run ©Grammar Traceª, one of its pre-built versions, or a ©File Traceª. You can access it from the ©Browse Menuª. It shows the number of times each rule in your grammar has been reduced. Unless you have set the ©Rule Coverageª ©configuration switchª, some ©null productionªs and some rules that consist of only one element will not be counted because of speed optimizations in the parser tables. The Trace Coverage tables are reset to zero when you load a new syntax file or start AnaGram. ## Compound Action Traditionally, ©LALR-1 parserªs use only four simple ©parser actionªs: shift, reduce, accept and error. AnaGram parsers use a number of compound actions in order to reduce the size of parse tables and speed up processing. A single compound action may replace several simple shift or reduce actions. The ©Traditional Engineª ©configuration switchª may be used to force AnaGram to use only the simple actions. ## Traditional Engine "Traditional engine" is a ©configuration switchª that defaults to off. Traditional ©LALR-1 parserªs use a ©parsing engineª which has only four actions: ©shift actionª ©reduce actionª ©accept actionª ©error actionª AnaGram, in the interest of faster execution and more compact parse tables, uses a parsing engine with a number of short-cut, or ©compound actionªs. The "traditional engine" switch tells AnaGram not to use the short-cut actions. You would turn this switch on if you wished to use the ©Grammar Traceª or ©File Traceª to see how the standard four parser actions work for a particular combination of grammar and input. Note that to see the effects of single parser actions, you must use the ©Single Stepª button. Remember that in the Grammar Trace, when you single step and the token you have selected causes a reduce action, it will appear on the ©lookahead lineª of the ©parser stack paneª and will be preselected in the ©allowable input paneª until it is finally shifted in to the parser stack. Normally, you should leave the "traditional engine" switch off, Then AnaGram will, whenever possible, compress several parsing actions into one compound action in order to speed execution of the parser. Unfortunately use of the term "traditional" has sometimes created the impression that there is a conservative aspect to the operation of traditional engine parsers. This is not the case. They have the same effect, but are slower and have much larger tables. ## Type Redefinition "Type Redefinition of TXXX: <token name> is a ©warningª message which appears when AnaGram finds a conflicting ©data typeª definition for a ©tokenª in your ©grammarª. The new definition will override the previous one. If you intend to use different type definitions, you should use extreme caution and check the generated code to verify that your ©reduction procedureªs are getting the values you intended. ## Undefined Symbol "Undefined symbol: <name>" is a ©warningª message which appears when AnaGram encounters an undefined ©symbolª while evaluating a ©character setª expression. The following warning in the ©Warningsª window identifies the particular ©tokenª AnaGram was trying to evaluate. ## Undefined Token "Undefined token TXXX: <name>" is a ©warningª message which appears when the indicated ©tokenª has been used in the ©grammarª, but there is no definition of it as a ©terminal tokenª nor does any ©productionª define it as a ©nonterminal tokenª. ## Unexpected "Unexpected <element 1> in <element 2>" is a ©warningª message which you may get when AnaGram analyzes your grammar. It appears when AnaGram unexpectedly encounters an instance of syntactic element 1 at the specified location in an instance of syntactic element 2. AnaGram cannot reliably continue parsing its input. Therefore, it limits further analysis to scanning for syntax errors. If this error is not the result of a prior error, you should correct your ©syntax fileª. Remember that this error could result from something missing just as well as from something extraneous. If element 1 is ©eofª, it often means that you have an unbalanced brace or comment delimiter in the code following the indicated location. ## Union The union of two sets is the set of all elements that are to be found in one or another of the two sets. In an AnaGram syntax file the union of two ©character setsª A and B is represented using the plus sign, as in A + B. The union operator has the same precedence as the ©differenceª operator: lower than that of ©intersectionª and ©complementª. The union operator is ©left associativeª. Watch out! In an AnaGram syntax file 65 + 97 represents the character set which consists of the lower case 'a' and upper case 'A'. It does not represent 162, the sum of 65 and 97. ## Video mode "Video mode" is an ©obsolete configuration parameterª. ## Virtual Production Virtual productions are a special short hand representation of ©grammar rulesª which can be used to indicate a choice of inputs. They are an important convenience, especially useful when you are first building a grammar. Here are some examples of virtual productions: name? // optional name name?... // 0 or more instances of name {name | number} // exactly one name or number {name | number}... // one or more instances of name or number [name | number] // optional choice of name or number [name | number]... // zero or more instances of name or number AnaGram rewrites virtual productions, so that when you look at the syntax tables in AnaGram, there will be actual ©productionªs replacing the virtual productions. A virtual production appears as one of the rule elements in a grammar rule, i.e. as one of the members of the list on the right side of a production. The simplest virtual production is the "optional" token. If x is an arbitrary token, x? can be used to indicate an optional x. Related virtual productions are x... and x?... where the three dots indicate repetition. x... represents an arbitrary number of occurrences of x, but at least one. x?... represents zero or more occurrences of x. The remaining virtual productions use curly or square brackets to enclose a sequence of rules. The brackets may be followed variously by nothing, a string of three dots, or a slash, to indicate the choices to be made from the rules. Note that rules may be used, not merely tokens. If r1 through rn are a set of ©grammar rulesª, then {r1 | r2 | ... | rn} is a virtual production that allows a choice of exactly one of the rules. Similarly, {r1 | r2 | ... | rn}... is a virtual production that allows a choice of one or more of the rules. And, finally, {r1 | r2 | ... | rn}/... is a virtual production that allows a choice of one or more of the rules subject to the side condition that rules must alternate, that is, that no rule can follow itself immediately without the interposition of some other rule. This is a case that is not particularly easy to write by hand, but is quite useful in a number of contexts. If the above virtual productions are written with [] instead of {}, they all become optional. [] is an optional choice, []... is zero or more choices, and []/... is zero or more alternating choices. Null productions are not permitted in virtual productions in those cases where they would cause an intrinsic ambiguity. You may use a ©definitionª statement to assign a name to a virtual production. ## Void token "Void token, <token name>, used as parameter" is a ©warningª message which appears if AnaGram encounters a ©data typeª definition declaring a ©tokenª to have type void when the token has previously been used in a ©parameter assignmentª for a ©reduction procedureª. Your C or C++ compiler will complain when it tries to compile the call to the reduction procedure. ## vs vs is a field in a ©parser control blockª to which your ©error handlingª procedures and ©reduction procedureªs may refer. It is the ©parser value stackª for your parser. The ©semantic valuesª of the ©tokensª identified by the parser are stored in the value stack. The value stack, like the other ©parser stacksª, is indexed by ©PCBª.©ssxª. When you are executing a reduction procedure, PCB.vs[PCB.ssx] contains the semantic value of the first token in the grammar rule you are reducing, PCB.vs[PCB.ssx+1] contains the second, and so forth. The return value from your reduction procedure will be stored in turn in PCB.vs[PCB.ssx]. vs is defined to be of type $_vt, where "$" represents the name of your parser. AnaGram defines $_vt to be a union of fields of sizes corresponding to all the different data types declared in your syntax for the semantic values of your tokens. In order to avoid restrictions on the use of C++ classes, the fields are defined as character arrays. On some processors which have byte alignment restrictions for multibyte data, you might encounter a bus error. To correct this problem, set the ©parser stack alignmentª parameter to an appropriate data type. ## Warning If while analyzing your syntax file, AnaGram finds something suspicious, it is likely to issue a warning. The Warnings window will pop up automatically when the analysis has been completed. If the warning is for a ©syntax errorª in your input file, you will have to fix it, because AnaGram cannot successfully interpret it. Otherwise, AnaGram will be able to create a ©parserª for you, if you wish, no matter how serious the warnings may be. You can bring up the Help topic associated with a highlighted warning by pressing F1 or by clicking with a ©Help Cursorª. If you have syntax errors, AnaGram will synchronize the cursor in the ©syntax fileª window with the cursor in the Warnings window so that whenever the Warnings window is active, the cursor bar in the syntax file window will identify the location of the error. ## What's New Changes in AnaGram 2.40 Most of the changes in AnaGram 2.40 are under the hood - cleanup of source files, reorganization of the source tree, revision of build and test procedures, and so forth, in preparation for the open source release. All of this will, with luck, be invisible to the end user. Open Source AnaGram is now ©open sourceª. AnaGram itself uses the 4-clause BSD ©licenseª; the ©parsing engineª, and thus the output files, are licensed with the less restrictive zlib ©licenseª. Source distributions are available from http://www.parsifalsoft.com. The manual has been re-typeset using LaTeX instead of WordPerfect. The typographic consistency and formatting has been considerably improved; unfortunately, the pagination is now completely different, so page numbers are not portable to the new version. All the logic dealing with registration, trial copies, serial numbers, and so forth has been removed. Unix Support The Unix build of the ©command line versionª of AnaGram (agcl) is now supported and available to the public. There is at present no GUI for the Unix version. The long-term goal is to migrate the AnaGram GUI away from the closed (and orphaned) IBM Visual Age class library to something else, probably GTK, so as to support both Windows and Unix. Improved Functionality Examples. The examples have been adjusted to the current dialect of C++ and are now compilable again. The legacy "classlib" code some still depend on is being phased out. Increased Convenience File names. File names in the AnaGram distribution and source tree are no longer limited to 8+3 characters, and quite a few now have less cryptic names. Additionally, all HTML files are now named ".html", not ".htm". Installed files. The AnaGram.cgb and AnaGram.hlp files found in older releases of AnaGram no longer exist; their contents are compiled into the AnaGram executables instead. Bug Fixes Engine compiler error. The ©error_messageª field of the PCB has been changed to const char * so current C++ compilers will accept the code generated when ©diagnose errorsª is turned off. Multiple output header files. Including more than one AnaGram output header file at once used to cause some compilers to issue a warning, because an #ifndef directive was checking the wrong symbol. This has been corrected. Wrappers and error tokens. AnaGram 2.01 generated uncompilable code if you tried to use the ©wrapperª feature and error token resynchronization at the same time. This has been corrected. More than 256 keywords. Build 8 of AnaGram 2.01 fixed certain problems with large keyword tables, but in the process introduced another, which is now fixed. For changes in the previous versions of AnaGram, see ©What's New in AnaGram 2.01ª and ©What's New in AnaGram 2.0ª. ## What's New in AnaGram 2.01 Changes in AnaGram 2.01 Improved Functionality Improved support for building ©thread safe parsersª. All nonconstant parser data previously declared as static variables has been moved to the ©parser control blockª. When the ©reentrant parserª switch is set, all references to the parser control block are passed to functions via calling sequences. The ©extend pcbª switch provides a mechanism to add user-defined variables to the parser control block. Improved support for C++ parsers. The ©wrapperª statement provides C++ wrapper classes for objects to be stored on the ©parser value stackª. The ©PCB_TYPEª macro allows you to derive a C++ class from the parser control block and to access its members from your ©reduction proceduresª. Support for the ©ISO Latin 1ª character set. When using the ©case sensitiveª switch, case conversion is performed for all ISO-Latin-1 characters, not just those in the ASCII range. Improved support for error diagnostics. It is now possible for users to provide their own text for the error messages created by the ©diagnose errorsª switch. In addition, the ©token namesª table option now includes ascii representation of individual characters and keywords instead of only named tokens. The ©token names onlyª switch can be used for compatibility with previous versions of AnaGram More precise determination of error context. The tables used by the ©error frameª option to provide the context of a syntax error have been reworked and now provide a substantially more precise localization of the error. Improved error diagnostics in AnaGram ©Missing reduction procedureª diagnostic. In addition to warning that there is a ©parameter assignmentª without a ©reduction procedureª, this diagnostic is now provided if the ©default reduction valueª does not have the same ©data typeª as the ©reduction tokenª. ©Command line versionª. Diagnostics have been reformatted so they can be recognized by the Microsoft Visual C++ IDE. Refined ©keyword anomalyª diagnostics. There should now be fewer false alarms. Increased Convenience ©File Traceª. If your grammar uses ©semantically determined productionsª, the File Trace feature will now remember the choices you have made for ©reduction tokenªs, so that you do not have to make the same choices over and over again as you work with an example. File Paths. The file paths in the #line directives created by the ©line numbersª switch now use forward slashes instead of backslashes. Changed Defaults ©Parser stack alignmentª. Now defaults to long instead of int. ©Parser stack sizeª. Now defaults to 128 instead of 32. Bug Fixes Interaction between context tracking and error token. In previous versions of AnaGram, if the first token in a rule was the ©error tokenª, the value of ©CONTEXTª was the value that corresponded to the location of the error. CONTEXT now correctly shows the context at which the aborted rule began. For instance, in the following example, if a syntax error is encountered while parsing the expression, the error rule will skip over remaining characters to the terminating semicolon. When invoked from handleError(), the CONTEXT macro will return the context as it was at the beginning of the expression. expression statement -> expression, ';' -> error, ~(eof + ';')?..., ';' =handleError(); ©Distinguish lexemesª. Several minor bugs in the implementation of distinguish lexemes have been corrected. Set partition logic. Corrected problems in the interaction between the set ©partitionª logic and the implementation of the ©disregardª statement. Table size. Fixed a data sizing problem which occurred when one particular parse table had precisely 256 entries. Keyword recognition. Fixed a problem that could cause difficulties with ©keywordª recognition when the ©case sensitiveª switch was turned off. Default conflict resolution. With unresolved ©shift-reduce conflictªs, the shift case was not always being selected. This problem has been corrected. Lockup. It was possible to write an erroneous grammar that would cause AnaGram to lock up. This problem has been corrected. Potential bus error. The error diagnostic funtion created by the ©diagnose errorsª switch, could, under some circumstances, access an uninitialized value on the ©parser value stackª. This problem has been corrected. Internal errors. Fixed a number of minor bugs which could cause ©internal errorªs while running ©File Traceª. For changes in the previous version of AnaGram, see ©What's New in AnaGram 2.0ª. ## What's New in AnaGram 2.0 AnaGram's user interface has been completely revamped to make it more convenient and easier to use. However, the same tried and true AnaGram algorithms are still in place to build your parsers. The rules for syntax files are also unchanged. The ©File Traceª and ©Grammar Traceª facilities have each had their windows combined into a single unit, and a ©Rule Stackª synched with these windows and with your syntax file window has been added. The Rule Stack is particularly convenient for relating the progress of the parse to the ©grammar rulesª in your ©syntax fileª. A ©text entryª field has also been added to the Grammar Trace. This means you can provide character input to your parser in much the same way you can with a ©test fileª in File Trace, but with instant control over the input. Some further controls have been added to both File and Grammar Traces. In particular there is a Reset button to reset the trace to its initial state. This is particularly useful for ©Conflict Traceªs. AnaGram now has a small ©Control Panelª (default position is at the upper right of the screen) from which you can conveniently control operation. A menu bar provides access to the various commands and tables. There are toolbar buttons for Analyze Grammar, Build Parser, File Trace, and so on. The panel also has a data entry field for entering search keys. You can set both colors and fonts in AnaGram windows to suit your own preferences. We suggest you check Help for ©Colorsª or ©Fontsª before making changes to make sure that all information will still be properly displayed. AnaGram's ©Helpª has been updated to provide hypertext-type links. But you can still keep multiple Help windows on view at once. A popup menu shows all the links in a window. New topics have been added. Also, further documentation topics are provided in HTML format in the html subdirectory. A ©Help Cursorª on the Control Panel toolbar can be used to get help for most AnaGram windows, buttons and menu items. F1 can also be used. On the ©Action Menuª you will find a list of your most recently used syntax files. Just click on the file of your choice to have AnaGram analyze it (or build it if ©Autobuildª is on). ## White Space In many grammars it is desirable to pass over blanks, tabs, and similar characters, as well as comments, collectively termed "white space", as though they were not there. The "©disregardª" statement in AnaGram may be optionally used to accomplish this. The "©lexemeª" statement may be used to exercise fine control over the scope of the disregard statement. ## Wrapper The wrapper ©attribute statementª provides correct handling of C++ objects returned by ©reduction procedureªs. If you specify a wrapper for a C++ object, then, when a reduction procedure returns an instance of the object, a copy of the object will be constructed on the ©parser value stackª and the destructor will be called when the object is removed from the stack. Without a wrapper, objects are stored on the value stack simply by coercing the stack pointer to the appropriate type. There is no constructor call when the object is stored nor a destructor call when it is removed from the stack. Classes which use reference counts or otherwise overload the assignment operator should always have wrappers in order to function correctly. Wrapper statements, like other ©attribute statementsª, must appear in configuration sections. The syntax is simply wrapper { <comma delimited list of data types> } For example: [ wrapper {CString, CFont} ] You cannot specify a wrapper for the ©default token typeª. If your parser exits with an error condition, there may be objects remaining on the stack. The ©DELETE_WRAPPERSª macro may be used to delete these objects. If you have enabled ©auto resynchª, DELETE_WRAPPERS will be invoked automatically. The ©AG_PLACEMENT_DELETE_REQUIREDª macro is used to control definition of a "placement delete" operator in the wrapper class AnaGram defines. ## Zero Length A zero length ©tokenª is a ©reduction tokenª which can be matched by a void, i.e. by nothing at all. It represents an optional item, or a sequence of optional items, in the input. Since the matching process can involve several levels of reductions, it is most precise to use the following recursive definition: A zero length token is one which either has at least one ©null productionª or has at least one grammar rule defining it such that all the tokens in the rule are zero length tokens. Care should be taken when using ©zero lengthª tokens in ©recursive ruleªs. If all the tokens in the rule other than the recursive token itself are zero length tokens the rule will generate an infinite loop in the generated parser. The ©Token Tableª identifies zero length tokens because the use of such tokens sometimes inadvertently causes ©conflictªs. ## Control Panel The AnaGram Control Panel appears at the upper right of your monitor when you start AnaGram. It has a menu bar, command buttons, a button which enables a ©help cursorª, and a ©status indicatorª. At the lower left you will see a data entry field for entering ©searchª keys, with neighboring search forward and search backward buttons. Notice that the ©Options Menuª has a "Stay On Top" entry which allows you to specify whether the Control Panel stays on top of other AnaGram windows. ## Status Indicator The status indicator at the right of the AnaGram Control Panel shows the status of the ©current grammarª: Ready Loaded Error Parsed Analyzed Built "Ready" appears only when no grammar has been selected. "Loaded" and "Parsed" are normally transitory. "Error" means at least one syntax error has been detected in your grammar and AnaGram cannot continue. Check the Warnings window to determine the nature of the problem. "Analyzed" means that a ©grammar analysisª has been completed, but no ©output filesª have been written. "Built" means that an analysis has been completed and output files have been written. ## Help Cursor The Help Cursor is accessed via the button with the question mark on AnaGram's ©Control Panelª. It is convenient for getting help on ©Warningªs, browse tables, menu items and so on. If you click on the button you enable the Help Cursor, which you can then drag with the mouse. A further mouse click will provide help for the item underneath the cursor. Note further that AnaGram also has F1 help which you may find simpler and faster than the Help Cursor. ## Search AnaGram has a simple search facility to let you search for text strings in AnaGram windows. A data entry field on the ©Control Panelª is provided for you to enter text. Left-clicking on the neighboring buttons lets you search either forward or backward for a line in the active window which contains at least one instance of the text. Note that the search begins at the next line after the highlighted line for forward search; at the line preceding the highlighted line for backward search. ## Search Key To find a text string in an AnaGram window, enter the string in the Search Key field in the ©Control Panelª and press Enter. To find another instance of the string click on the ©Find Nextª button or press F3. To find a previous instance of the string click on the ©Find Previousª button or press F4. In windows that have a cursor bar, a forward search begins on the line following the cursor and a backward search begins on the line preceding the cursor. ## Find Next The Find Next key, on the ©Control Panelª immediately to the right of the ©Search Keyª field, locates the next instance of the search key in the most recently active AnaGram window. F3 is the keyboard equivalent. ## Find Previous The Find Previous key, on the ©Control Panelª immediately to the right of the ©Find Nextª key, searches backwards for the search key in the most recently active AnaGram window. F4 is the keyboard equivalent. ## Fonts, Set Fonts The Set Fonts dialog allows you to use the fonts of your choice in AnaGram windows. You should make sure that the ©marked tokenªs font is very distinctive so that marked tokens will show up clearly even if they are only 1 or 2 characters long. Sometimes it is helpful to use an underlined font for marked tokens. A Default button at the bottom of the dialog lets you revert to AnaGram's original fonts if you wish. ## Colors, Set Colors The Set Colors dialog allows you change the colors of AnaGram windows. Notice that in the ©File Traceª the ©test file paneª requires three different sets of text and background colors. You should make sure that the backgrounds, at least, can be easily distinguished from each other so the trace information can be properly displayed. You also want to take care that an active pane in a File Trace or Grammar Trace can be distinguished from inactive panes. The Default button at the bottom of the dialog lets you revert to AnaGram's original colors if you wish. Color changes pertain only to the client areas of AnaGram windows. The remaining parts of your windows will have the customary colors you have chosen for your system. ## Marked Token Some tables and trace panes display each rule with one token marked to show how far parsing has progressed in the rule. The marked token is the next input expected in the input stream. It is shown in a different font to distinguish it from other tokens in the rule. If no token is marked, the rule is a ©completed ruleª, i.e. it has been completely matched and will be reduced by the next input. You can set the font for marked tokens by choosing Fonts from the ©Options Menuª. You should make sure that the font is very distinctive so that marked tokens will show up clearly even if they are only 1 or 2 characters long. Sometimes it is helpful to use an underlined font for marked tokens. ## Synch Parse The Synch Parse button replaces the ©Single Stepª button on the toolbar of the ©File Trace windowª when, for some reason, the location of the blinking cursor in the ©test file paneª differs from the current parse position. This can occur when you single click in the test file pane or when the parse cannot track the cursor because of a ©syntax errorª or a ©semantically determined productionª. Click the synch parse button to resynch the parse with the cursor. ## Single Step The Single Step button is one of the control buttons for the ©File Traceª and ©Grammar Traceª. It advances the parse one ©parser actionª at a time. In the File Trace, it is replaced with the "©Synch Parseª" button whenever the blinking cursor loses synch with the current parse location. In the Grammar Trace, the Single Step button takes its input from the Allowable Input pane, the Reduction Choices pane, or the ©text entryª field, depending on which is active. ## Proceed The Proceed button is one of the control buttons for the ©Grammar Traceª. If the ©Reduction Choices paneª or the ©Allowable Input paneª is active, Proceed parses the highlighted token until it is shifted in to the ©parser stackª. If the ©text entryª field is active, Proceed parses all text in the field. If a ©syntax errorª is encountered, the parse stops and all ©reduce actionªs are undone. Note that selecting a token in Allowable Input can cause a syntax error under certain circumstances. This can happen only if the following conditions are all true: the indicated operation is a ©reductionª, the reduction token for the rule being reduced has been used in several different contexts in the grammar and the specified token may follow it in some contexts and not in others. ## Reduction Choices Pane The ©File Traceª and ©Grammar Traceª display a Reduction Choices pane when they need to reduce a ©semantically determined productionª. The rule to be reduced is highlighted in the ©rule stack paneª. If the ©syntax fileª window is visible, it shows the rule in context in your grammar. The Reduction Choices pane lists all possible ©reduction tokenªs for the specified rule. The first reduction token that is admissible in the current context is highlighted and it appears as the ©lookahead tokenª in the ©parser stack paneª. The text that comprises the entire rule is highlighted in the ©test file paneª. Select the desired reduction token before continuing with the parse. If you select a token and it does not appear as the lookahead token, it is not syntactically correct in the current context. If you try to proceed with the parse, you will get a ©selection errorª. ## Selection Error The ©Parse Statusª field indicates a "selection error" if you choose a ©reduction tokenª from the ©Reduction Choices paneª of a ©File Traceª or ©Grammar Traceª and the selected token is not syntactically correct in the current context. ## Parser Stack Pane The Parser Stack pane, the upper left pane of the ©File Traceª and ©Grammar Traceª windows, displays the ©parser stackª for the current trace. Each line corresponds to one level in the parser state stack. It shows the stack index, the ©parser stateª for that level, and the ©tokenª which was seen at that state. The last line of the stack, the ©lookahead lineª, corresponds to the current state of the parser. Since no input has yet been processed for this state, the token, if any, which appears at this level is a ©lookahead tokenª. If you move the cursor in the Parser Stack pane of a File Trace, the text that makes up the selected token will be highlighted in the ©Test File paneª. You can back the parse up to any desired stack level by double clicking at the beginning of the token text in the Test File pane. Similarly, if you move the cursor bar in the Parser Stack pane of a Grammar Trace, the ©Allowable Input paneª will change to display the allowable tokens in the selected state. The previously selected token will be highlighted. Then, double click on any token in the Allowable Input pane to back the parse up and choose a token a second time. The ©Rule Stack paneª of the File or Grammar Trace is also synched to the Parser Stack pane. If the ©syntax fileª window is visible, it will be synched to show the rule currently selected in the rule stack pane. Note that rules that have been automatically generated by the expansion of ©virtual productionsª cannot be synched, so the top line of the syntax file will be highlighted instead. In the Grammar Trace, the last line of the Parser Stack may or may not display a ©lookahead tokenª, depending on the last ©parser actionª performed. If input was taken from Allowable Input and the last action was a simple ©reduce actionª, the last input token selected will be displayed as the lookahead input. But if the last action performed shifted the token in, the lookahead field will be empty. If you right-click on a highlighted line in the Parser Stack pane, you will get a pop-up menu to give you more information. In particular you can get an ©Auxiliary Traceª starting at the current point in your File or Grammar Trace, so you can explore various possibilities without losing your position in the old trace. ## Exit Select this entry from the ©Action Menuª to terminate AnaGram. ## Allowable Input, Allowable Input Pane The upper right pane of the ©Grammar Traceª window lists the allowable input tokens for the current state of the ©grammarª. The tokens in the Allowable Input pane are listed in two groups: first, the ©terminal tokensª allowable in this state, and second, the ©nonterminal tokensª. Between these two groups of tokens is inserted a line which is either an option for a ©default reductionª, or declares that there is no default action. Double click, press Enter, or click the ©Proceedª button to parse the highlighted token. When all parse actions triggered by the highlighted token have been completed, all panes of the trace will be redrawn to show the new state of the parser. Note that selecting a token in Allowable Input can cause a syntax error under certain circumstances. This can happen only if the following conditions are all true: the indicated operation is a ©reductionª, the reduction token for the rule being reduced has been used in several different contexts in the grammar and the specified token may follow it in some contexts and not in others. If you wish to see the results of a single parser action, click on the ©single stepª button. The parser will perform a single parser action. If the token you selected was not shifted in, it will now be displayed as the ©lookahead tokenª on the last line, the ©lookahead lineª in the ©Parser Stack paneª, and will be preselected in the Allowable Input pane. Because AnaGram, by default, uses a number of compound parser actions, this situation does not arise very often unless you have set the ©traditional engineª switch or reset the ©default reductionsª switch. Usually you will want to select the same token to proceed, but it is not necessary. The Allowable Input pane also displays the ©parser actionª associated with a specific token. If it is not a ©compound actionª, the action and its result are also shown. The ©parser actionª field for a token may be interpreted as follows: If this token would cause a shift to a new state, the action field is ">>" followed by the new state number. If the token would cause a ©reductionª, the action field is "<<" followed by a ©rule numberª to show the rule reduced. If the parser action is a compound action, the action field is blank. If the token would cause the grammar to be accepted, the action field is "Accept". The ©text entryª field at the bottom of the Grammar Trace can be used as a convenient alternative to the Allowable Input pane. It accepts characters rather than tokens. Most non-printing characters such as newline are only available from Allowable Input. ## Copy The Copy command on the ©Windows Menuª copies the currently active table or Help topic to the clipboard. ## Statistical Summary While your grammar is being analyzed, a Statistical Summary window pops up to show you the progress of the analysis. Unless you have turned off ©Show Statisticsª on the ©Options Menuª, this window will remain on-screen for your reference. Among other things, it shows you the number of rules and states in your grammar, and the number of conflicts and warnings, if any. Note that if your grammar is small and you have Show Statistics turned off, the appearance of this window on your monitor may be exceedingly brief - you may just see a flash. If the window is turned off or you have closed it, you can get it from the ©Browse Menuª. ## Stay On Top The Stay On Top entry in the ©Options Menuª allows you to specify whether the ©Control Panelª stays on top of other AnaGram windows. ## Show Syntax If this entry in the ©Options Menuª is checked, AnaGram will display the ©syntax fileª when it has analyzed your ©grammarª. If this entry is not checked or you have closed the syntax file window, you can select the window from the ©Browse Menuª. ## Show Statistics If this entry in the ©Options Menuª is checked, AnaGram will leave the ©Statistical Summaryª on the screen after it has analyzed your ©grammarª. If this entry is not checked or you have closed the Statistical Summary window, you can select the window from the ©Browse Menuª. ## About AnaGram Select this entry from the ©Help Menuª to find out the version and serial numbers of your copy of AnaGram, and how to contact Parsifal Software. ## Help Topics Select Help Topics from the ©Help Menuª to get a complete list of AnaGram Help Topics titles. You can bring up the window for a highlighted topic by double-clicking with the left mouse button, pressing F1, or using the ©Help Cursorª. ## Cascade Windows Select this entry from the ©Windows Menuª to cascade your open windows starting at top left of the screen. ## Close Windows Select this entry from the ©Windows Menuª to close all open windows except the ©Control Panelª. You may also close the active window by pressing the Escape key. ## Hide Windows Select this entry from the ©Windows Menuª to hide all open windows except the ©Control Panelª. Restore them to the screen with ©Restore Windowsª ## Restore Windows Use this command on the ©Windows Menuª to restore to the screen any windows you have previously hidden with ©Hide Windowsª. ## Token Input, Preprocessor, Lexical Scanner AnaGram makes it unnecessary, in most cases, to have a separate preprocessor to provide the ©tokensª which are fed to your parser. However in some cases you may want to use a preprocessor, or lexical scanner, to provide input to your parser. The preprocessor may or may not be written in AnaGram. If it sends the parser token numbers, as opposed to character codes, this is referred to as token input, as opposed to character input. Please refer to the AnaGram User's Guide for information on identifying the tokens to the parser and providing their semantic values, if any. Since a ©File Traceª is based on character codes, it will be greyed out on the ©Action Menuª if you have token input. For a ©Grammar Traceª, entering characters in the ©text entryª field is not appropriate and will simply cause a syntax error. ## Lookahead Line The last line of the ©Parser Stack paneª, the "lookahead" line, will sometimes show a ©lookahead tokenª, and sometimes not. In a ©File Traceª, you will always see a lookahead token because it is available from the ©test fileª. In a ©Grammar Traceª you will usually see a lookahead token only when you have used the ©Single Stepª button or if there is available input in the ©text entryª field. In the latter case the token corresponding to the first character of the input will appear on the lookahead line. If you click Single Step after selecting a token from ©Allowable Inputª and it causes only a simple ©reduce actionª (as opposed to a shift or a compound action), then, upon completion of the reduction, the token you selected will appear on the lookahead line and also will be preselected in Allowable Input. Usually you would select this token for the next parse step. However, if there are other possible inputs in this state, the parse theoretically could have arrived at this state by a different sequence of input tokens. Thus, if you are more interested in the behavior of the parser at this state than in the response of the parser to a particular sequence of inputs, it is perfectly valid to select a different input token, and AnaGram will let you do it. Note that if you have enabled the ©traditional engineª switch or disabled the ©default reductionsª switch, the probability of finding a token which does a simple reduction is noticeably higher than otherwise. ## Action Menu The Action menu begins with the ©Analyze Grammarª and ©Build Parserª commands. If a grammar has already been analyzed, but not yet built, there will also be an extra Build command bearing the name of your syntax file. There are also ©Reanalyzeª and ©Rebuildª commands which are initially greyed out. They become available if you change the current syntax file. The next section has ©File Traceª and ©Grammar Traceª commands. If you have enabled the ©Error Traceª ©configuration switchª, this section also shows an Error Trace command. The menu ends with an ©Exitª command and a list of recently used syntax files, if any. Just click on a syntax file name to have AnaGram analyze it, or build it if the ©Autobuildª option is on. ## Browse Menu Initially, the Browse Menu shows only a single entry: ©Configuration Parametersª which lets you see the current state of configuration parameters before any may have been set by your syntax file. Once you have analyzed a grammar, this menu fills up with many tables containing information about your grammar. You can also bring up a window showing your ©syntax fileª from this menu. If your grammar has generated ©syntax errorªs or warnings, or contains conflicts, there will be ©Warningªs or ©Conflictªs entries. ## Options Menu From this menu you can select a ©Fontsª or ©Colorsª dialog so you can set AnaGram's fonts and colors to suit your own tastes. You can set ©Autobuildª if you want AnaGram to automatically build your ©grammarª when you select a ©syntax fileª from the ©Action Menuª. You can also choose whether or not to automatically show the ©Statistical Summaryª window or your syntax file window when you open a grammar, or make the ©Control Panelª stay on top of other AnaGram windows. ## Windows Menu The Windows menu lets you cascade, close, or hide all AnaGram windows except the ©Control Panelª, or restore them if they have been hidden. It also has a list of open windows (even if hidden) so you can select the one you want. The Copy command will copy most windows to the clipboard. ## Help Menu The Help Menu has the following entries: ©Getting Startedª provides a brief description of AnaGram and introductory suggestions. ©Help Topicsª brings up a list of all help topics. ©Using Helpª tells you how to use AnaGram's help facilities. ©What's Newª has information on new features of this version of AnaGram. ©About AnaGramª tells you what version of AnaGram you are using, and also provides contact information for Parsifal Software. ## Autobuild When Autobuild (©Options Menuª) is checked, selecting a file from the list of most recently used files on the ©Action Menuª invokes the ©Build Parserª command. Otherwise, the ©Analyze Grammarª command is invoked. ## Reanalyze, Rebuild Reanalyze and Rebuild commands on the ©Action Menuª are initially greyed out. Reanalyze becomes available if you have a syntax file currently analyzed or built in AnaGram and change it while AnaGram is still running. Rebuild becomes available if you have a syntax file currently built and change it while AnaGram is still running. ## Percent Sign The percent sign ( % ) is used to mark certain tokens in your grammar which AnaGram must redefine in order to implement the ©disregardª statement. If you have used this statement in your grammar, You will probably notice the percent sign appearing in some windows and traces. The percent sign indicates the original token, without the optional white space attached. Early versions of AnaGram used the degree sign instead, but this character is not generally available in Windows. ## Program Development The first step in writing a program is to write a ©grammarª in AnaGram notation which describes the input the program expects. The file containing the grammar, called the ©syntax fileª, should have the extension ".syn". You could also make up a few sample input files at this time, but it is not necessary to write ©reduction procedureªs at this stage. Run AnaGram and use the ©Analyze Grammarª command to create parse tables. If there are ©syntax errorsª in the grammar at this point, you will have to correct them before proceeding, but you do not necessarily have to eliminate ©conflictsª, if there are any, at this time. There are, however, many aids available to help you with conflicts. These aids are described in the AnaGram User's Guide, and somewhat more briefly in the Online Help topics. Once syntax errors are corrected, you can try out your grammar on the sample input files using the ©File Traceª facility. With File Trace, you can see interactively just how your grammar operates on your test files. You can also use ©Grammar Traceª to answer "what if" questions concerning input to the grammar. The Grammar Trace does not use a test file, but rather allows you to make input choices interactively. At any time, you can write ©reduction procedureªs to process your input data as its components are identified in the input stream. Each procedure is associated with a ©grammar ruleª. The reduction procedures will be incorporated into your parser when you create it with the ©Build Parserª command. By default, unless you specify an input procedure, ©parser inputª will be read from stdin, using the default ©GET_INPUTª macro. You will probably wish to redefine GET_INPUT, or configure your parser to use ©pointer inputª or ©event drivenª input. ## License, Copyright, Copying, Open Source, Warranty, No Warranty AnaGram, A System for Syntax Directed Programming Copyright 1993-2002 Parsifal Software Copyright 2006, 2007 David A. Holland All Rights Reserved. AnaGram itself is released to the public under the traditional 4-clause BSD license: Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by Parsifal Software, Jerome T. Holland, and their contributors. 4. Neither the name of Parsifal Software nor the name of Jerome T. Holland nor the names of their contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY PARSIFAL SOFTWARE, JEROME T. HOLLAND, AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PARSIFAL SOFTWARE, JEROME T. HOLLAND, OR THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. The AnaGram ©parsing engineª, that is, the code that is emitted by AnaGram and incorporated into programs developed using AnaGram, uses this less restrictive zlib-style license: This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. ##