ProgressLexer.java
// $ANTLR 2.7.7 (20060906): "progress.g" -> "ProgressLexer.java"$
/*
** Module : ProgressParser.java
** ProgressParserTokenTypes.java
** ProgressLexer.java
** Abstract : lex and parse Progress 4GL source code
**
** Copyright (c) 2004-2024, Golden Code Development Corporation.
**
** -#- -I- --Date-- --JPRM-- ----------------------------------Description-----------------------------------
** 001 GES 20041116 @18747 WARNING, THIS IS A GENERATED FILE!!! DO NOT EDIT THIS FILE. The original source
** file is progress.g!
*/
package com.goldencode.p2j.uast;
import java.io.*;
import java.util.*;
import java.util.function.*;
import java.util.logging.*;
import com.goldencode.ast.*;
import com.goldencode.p2j.schema.*;
import com.goldencode.util.*;
import com.goldencode.p2j.cfg.*;
import com.goldencode.p2j.convert.*;
import com.goldencode.p2j.preproc.*;
import com.goldencode.p2j.util.*;
import antlr.*;
import antlr.debug.misc.ASTFrame;
import java.io.InputStream;
import antlr.TokenStreamException;
import antlr.TokenStreamIOException;
import antlr.TokenStreamRecognitionException;
import antlr.CharStreamException;
import antlr.CharStreamIOException;
import antlr.ANTLRException;
import java.io.Reader;
import java.util.Hashtable;
import antlr.CharScanner;
import antlr.InputBuffer;
import antlr.ByteBuffer;
import antlr.CharBuffer;
import antlr.Token;
import antlr.CommonToken;
import antlr.RecognitionException;
import antlr.NoViableAltForCharException;
import antlr.MismatchedCharException;
import antlr.TokenStream;
import antlr.ANTLRHashString;
import antlr.LexerSharedInputState;
import antlr.collections.impl.BitSet;
import antlr.SemanticException;
/**
* Tokenizes a Progress 4GL source file (input as a stream of characters)
* into a stream of tokens suitable for the <code>ProgressParser</code>.
* Each token has an integer token type by which the parser references and
* matches tokens. This is done to make a high performance parser. To make
* this work, the lexer must create a token object when it matches a top
* level rule, this token object includes the token type and the actual text
* found in the original character stream. The lexer's main job is to
* lookahead into the character stream, switch into the top level rule that
* matches some set of characters and when this is complete, to create a
* valid token object and return this to the parser. The lexer thus
* implements a token stream interface from the parser's perspective.
* <p>
* <b>Please note that this is a generated file using ANTLR 2.7.4 and a
* grammar specified in <code>progress.g</code>.</b>
* <p>
* The Progress 4GL language is highly context sensitive, particularly in
* the area of user-defined symbols and language keywords. Examples of this
* attribute include:
* <ul>
* <li> The polymorphic usage of the same language keywords for different
* meaning depending on which language statement is being processed.
* <li> The very large number of language keywords means that many or
* most of these must be left as unreserved keywords (the user may
* define symbols that hide these keywords).
* <li> The same symbol may appear in multiple different namespaces in
* the same procedure, yet these different uses are all
* properly differentiated.
* </ul>
* <p>
* Such constructions cannot be disambiguated by looking ahead on a character
* basis. Instead, the context depends upon a lookahead at the token level.
* This means that such items must be handled by the parser rather than the
* lexer. For this reason, the lexer is only partially able to participate
* in the process of symbol resolution.
* <p>
* There are many different types of symbols. Language keywords are the
* most obvious symbol that are visible in all Progress 4GL source files.
* Other types include variables, procedure names, function names, labels,
* temp table names, etc. All of these symbols follow the same basic
* rules by which they are matched in the lexer, for details on this, see
* <code>{@link #mSYMBOL}</code>. As a result, the basic symbol rule in the
* lexer matches all of these types and cannot set the token type properly
* since it doesn't have enough information to do so at the time it is
* matching.
* <p>
* Symbol resolution is the process by which the proper token type is
* assigned to a token created from a match to the generic symbol rule.
* In the lexer, the only symbol resolution that can be done is to match
* with language keywords. Language keywords are given preference over
* other symbol types in any case where there is a conflict. This is done
* because there are significantly more locations in the parser that are
* matching on language keywords than there are locations where a user
* defined symbol can be in use. Thus it makes sense to handle the conflicts
* at the smaller number of locations in the parser, and assume that a
* keyword match is first a keyword. This has a great simplifying effect
* on the parser design. The result is selected locations in the parser
* that override (reassign) the token type based on context.
* <p>
* It seems that the parser could provide feedback to the lexer at certain
* points in its parsing. By storing shared state with the lexer, the
* lexer could then assign the token type properly instead of taking the
* "error on the side of keywords" approach which it takes now.
* However, due to the manner in which the parser does lookahead, this shared
* state implementation is not possible. The lookahead can be done at a level
* in the parser at which the context is not yet known (outside of the rules
* that actually handle the matching). If the lookahead depth (the
* "k") is greater than 1, then symbolic tokens (with the default
* token type set) can be returned before the parser can set the state
* variables that would properly control the assignment of those same
* tokens. <b>The decoupling of parser lookahead from the rules that know
* enough to set the state causes it to be infeasible to implement shared
* state between the parser and the lexer.</b>
* <p>
* The hundreds (thousands?) of keywords supported by Progress 4GL naturally
* drive the use of symbol resolution and token type rewriting rather than
* hard coding a rule for every keyword. This is also made necessary by the
* need to implement abbreviation support. All of this is handled in the
* lexer by the relatively small rule <code>mSYMBOL</code>. This efficient
* approach to keyword processing makes the lexer significantly smaller and
* much simpler to implement and maintain that it otherwise might have been
* given the keyword-richness of Progress 4GL.
* <p>
* Other key design points:
* <ul>
* <li> Progress 4GL is generally case-insensitive and for this reason
* this grammar has been designed to ignore case. All symbol
* definitions use lowercase characters and ANTLR generates code to
* match both the uppercase and lowercase version of each character.
* This is enabled using the lexer options section.
* <li> The lexer is defined to create a single token of any string or
* comment, including nested comments (which are all provided to the
* parser in one single token). All logic for matching comments and
* string literals (both single quoted and double quoted) is embedded
* in the lexer. This <b>greatly simplifies</b> the parser since
* Progress allows these to be placed in such a wide range of
* locations (e.g. comments can be inserted anywhere in between
* keywords in any language statement) that it would be impossible to
* properly manage the state in the parser due to the essentially
* infinite number of permutations.
* <li> At the top level of the lexer, all tokens are one of the
* following types:
* <ul>
* <li> comments
* <li> string literals
* <li> whitespace (spaces, tabs, carriage returns, line feeds)
* <li> operators
* <ul>
* <li> relational
* <li> comparisons
* <li> arithmetic
* <li> assignment
* <li> precedence (parenthesis)
* <li> array subscripting
* </ul>
* <li> statement and parameter separators (period, colon, comma,
* and at sign)
* <li> integer and decimal literals
* <li> date literals
* <li> the unknown value
* <li> language keywords
* <li> user-defined symbols
* <li> filenames (relative or absolute)
* <li> r-code library references
* <li> partially or fully qualified database symbols
* <li> the ignore character for set/update statements (the caret)
* <li> tildes
* <li> other special characters that are invalid Progress 4GL
* but which may occur in arbitrary token lists used in
* things such as shell commands that are embedded in Progress
* source code (these are "unknown tokens")
* </ul>
* <li> The lexer's top level entry point is <code>nextToken</code>. This
* method has a for-loop that uses up to 3 characters of lookahead
* to identify which of the top level token rules to call. To do
* this, each token rule's left-most match characters are "rolled up"
* and tested in this top level rule.
* <li> Since comments and strings are at the same precedence level, each
* can be embedded in the other.
* <li> Comments and whitespace tokens are both artificially set to the
* special "skip" token type, which drops them from the token
* stream seen by the parser. This is an important feature that
* simplifies the parser design. At some future time, it is possible
* to capture the comments into another hidden token stream, but at
* this time it is not done.
* <li> To simplify the parser design, an assumption was made that every
* Progress source file comes with the dot after the last statement.
* Progress allows the last dot to be omitted. The lexer is
* responsible for injection of a fake dot character if this is the
* case. it is done by using a filtered input stream provided by
* DotKludgeStream and DotKludgeReader classes. Those classes append
* a dot character to the regular input if necessary thus providing
* a consistent input to the lexer.
* </ul>
* <p>
* All token types are defined as integer constants in
* <code>{@link ProgressParserTokenTypes}</code> which is an Interface that
* the parser, lexer and other related classes all implement. This allows
* all of these classes to directly refer to the token types and share this
* common set of definitions. All top-level lexer rules generate a token
* of the same name in the <code>ProgressParserTokenTypes</code> Interface.
* There is a tokens { } section in the parser where artificial tokens are
* defined (tokens that are not backed by a lexer rule). These tokens are
* also added to the <code>ProgressParserTokenTypes</code> Interface and can
* thus be directly referenced by the lexer and parser.
* <p>
* Two of the most important lexer rules are {@link #mSYMBOL} and
* {@link #mNUM_LITERAL}. Each of these rules process highly ambiguous
* constructs requiring a rule that recognizes multiple token types and
* overrides the default type based on the internal matching. Both rules
* have to disambiguate the '.' character and the <code>mSYMBOL</code> rule
* also has to handle the '/' character. <b>Changes to these rules must be
* handled with the utmost care!</b>
* <p>
* Due to the near total overlap between schema processing and Progress 4GL
* source code, this lexer has been updated to support a mode with schema-
* specific keywords such that it can lex the standard schema dump-file
* (.df format). The only difference is the addition of a small set of
* schema-specific keywords that are activated by the method
* {@link #activateSchemaProcessing}. Once activated it cannot be removed!
*/
public class ProgressLexer extends antlr.CharScanner implements ProgressParserTokenTypes, TokenStream
{
/** Logger. */
private static final ConversionStatus LOG = ConversionStatus.get(ProgressLexer.class);
/** Stores all keyword definitions in alphabetical order. */
private static Keyword[] keywords = null;
/** Stores all ignored keyword definitions. */
private static Keyword[] ignored = null;
/** Debug mode, defaults to <code>false</code>. */
private boolean debug = false;
/** Schema mode, defaults to <code>false</code>. */
private boolean schema = false;
/** Export mode, defaults to <code>false</code>. */
private boolean export = false;
/** Hidden mode, defaults to <code>false</code>. */
private boolean hidden = false;
/** Raw string processing mode, defaults to <code>false</code>. */
private boolean raw = false;
/** Honor backslashes as escape characters. */
private boolean unixEscapes = true;
/**
* Allow slash-slash style comments (started in v11, older code can have unquoted filenames
* that include this same construct and will break parsing.
*/
private boolean allowSlashSlash = true;
/**
* Enables language keyword resolution. This instance is shared with the
* parser but no real time state sharing is done.
*/
private SymbolResolver sym = null;
/**
* Creates a <code>Keyword</code> array and initializes that array to
* the list of all recognized Progress 4GL language keywords. The
* initialization is done in-line and the source file is organized in
* an easy to maintain column format.
* <p>
* The following values are needed for each <code>Keyword</code> object:
* <ul>
* <li> full keyword text for the keyword
* <li> the minimum number of characters for matching ( > 0 means that
* abbreviations are possible, 0 means no abbreviations)
* <li> the integer token type to assign to the keyword on a match
* (see below)
* <li> whether it is a reserved keyword or not (true means it is
* reserved)
* </ul>
* <p>
* See <code>{@link Keyword}</code> for more details.
* <p>
* The core idea here is to populate a facility where the symbol text (in
* the mSYMBOL method) can be submitted to the keyword dictionary for a
* lookup. If a match is found, then the token type of the token is set
* based on the token type field in the <code>Keyword</code> object
* found in the dictionary. This returned token type will override the
* default token type of <code>SYMBOL</code>. Since all of these keywords
* are not encoded in the matching rules of the grammar itself, there are
* no actual token definitions in the lexer that match these keywords.
* For this reason, we take advantage of the feature in the parser in
* which we can create (reserve) a unique integer value and associate it
* with a specific artificial token name (e.g. KW_DEFINE). These
* artificial token types are used as the values when constructing
* <code>Keyword</code> objects.
* <p>
* When adding <code>Keyword</code> objects to this array, make sure to
* add the associated artificial token type to the tokens { } section
* of the parser.
* <p>
* Some entries have inherent conflicts due to ambiguity in the Progress
* language. For example, <code>WIDTH</code> and <code>WIDTH-CHARS</code>
* can both be abbreviated as <code>WIDTH</code> even though they are
* used for completely separate purposes and are described as separate
* keywords. Of course, one cannot use <code>WIDTH-</code> or
* <code>WIDTH-C</code> etc as a replacement for <code>WIDTH</code>. So
* these really are 2 different keywords but there are fixups inside
* Progress that makes it tolerant of this issue. In our case, we detect
* these possible overlaps in the parser and rewrite the token to the
* expected version so that downstream processing is easier. In this
* list, some changes have been made to ensure that conflicts don't
* occur (e.g. <code>WIDTH-CHARS</code> is stated to have a minimum
* abbreviation of 6 chars instead of the correct value of 5).
* <p>
* The following keywords exist in the keyword list but they have no
* references in the parser. There are two reasons for this. First,
* some of the keywords are used for stored procedure support which is
* currently incomplete in the parser. When that support is completed,
* these keywords should be removed from this list. Second, there are
* several keywords which are listed in the keyword index and in the notes
* their purpose is stated. However, no other reference to these keywords
* exists in the language reference. So these are listed as "possible
* undocumented ..." features. In this case, when there is enough
* information available to determine how they must be supported, those
* changes to the parser can be made and the tokens should then be removed
* from this list.
* <pre>
* Exists
* in 4GL
* Keyword
* Keyword Text Token Index Issue
* ------------------------ ----------- ------- ----------------------------------------------------------------------
* CLOSEALLPROCS KW_CLOSE_AP no special stored-procedure-related name, not fully implemented in parser
* MARGIN-HEIGHT-CHARS KW_MARG_H_C yes possible undocumented attribute
* MARGIN-HEIGHT-PIXELS KW_MARG_H_P yes possible undocumented attribute
* MARGIN-WIDTH-CHARS KW_MARG_W_C yes possible undocumented attribute
* MARGIN-WIDTH-PIXELS KW_MARG_W_P yes possible undocumented attribute
* OCTET-LENGTH KW_OCT_LEN yes possible undocumented FIND option
* PROC-TEXT KW_PROC_TXT yes special stored-procedure-related name, not fully implemented in parser
* PROC-TEXT-BUFFER KW_PROC_T_B yes special stored-procedure-related name, not fully implemented in parser
* RULE-Y KW_RULE_Y yes possible undocumented attribute
* SCROLL-DELTA KW_SCR_DELT yes possible undocumented attribute
* SCROLL-OFFSET KW_SCR_OFFS yes possible undocumented attribute
* SCROLLED-ROW-POSITION KW_SCR_RPOS yes possible undocumented attribute
* SEND-SQL-STATEMENT KW_SEND_SQL yes special stored-procedure-related name, not fully implemented in parser
* TRAILING KW_TRAILING yes possible undocumented built-in function and option for FOR/DO/REPEAT
* </pre>
* <p>
* In addition to the above keywords, there are many other keywords that
* may appear in the keyword list below, but which are not otherwise
* referenced. There are 3 common reasons for this:
* <ul>
* <li> an event name will be used as the <code>oldtype</code>
* annotation of an EVENT node
* <li> an constant name may be used in certain built-in functions or
* method calls
* <li> an built-in function (or built-in global variable) name will be
* used as the <code>oldtype</code> annotation
* </ul>
* There is no problem with the parser/lexer in this regard. Do not be
* concerned!
* <p>
* With this noted, there are some cases where the keyword list appears
* to be missing some keywords that are listed in the Progress 4GL Language
* Reference Keyword Index.
* <p>
* The most common case is a "duplicated" keyword that is really a synonym
* for another longer keyword. The longer keyword has an abbreviation
* which makes it match the same text as the shorter keyword. From the
* Progress compiler's perspective both forms are treated the same. This
* is different from the <code>WIDTH</code> and <code>WIDTH-</code> case
* noted above, since in that case the keywords are not synonyms. In
* the duplicate case, the shorter keyword is considered a duplicate of
* the longer one. WE ALWAYS INCLUDE THE LONGER KEYWORD WITH ITS
* ABBREVIATION AND THE SHORT KEYWORD IS NOT NEEDED BECAUSE IT IS HANDLED
* BY THE OTHER ONE THAT IS ALREADY THERE. In other words, this short
* keyword never needs to be added to the keyword list because the support
* is already sufficient. It is unknown why Progress documented "both"
* keywords, because the longer one covers both usages. In all such cases
* the short keyword will be missing and that is OK! Here is the list:
* <p>
* <pre>
* Short Keyword Text Long Keyword Text Abbreviation
* ------------------ -------------------- ------------
* ACCUM ACCUMULATE 5
* ASC ASCENDING 3
* BUTTON BUTTONS 6
* DESC DESCENDING 4
* FIELD FIELDS 5
* FORM FORMAT 4
* FORWARD FORWARDS 7
* MAX MAXIMUM 3
* MIN MINIMUM 3
* REPOSITION-BACKWARD REPOSITION-BACKWARDS 19
* REPOSITION-FORWARD REPOSITION-FORWARDS 18
* </pre>
* <p>
* The following are keywords that are documented in the Progress 4GL
* Language Reference Keyword Index but which are not really language
* keywords at all:
* <p>
* <ul>
* <li><code>DEFINED</code> - this is a symbol that is a preprocessor
* function but it is not something that has any meaning in a 4GL
* program so the parser should not have any knowledge of it
* <li><code>ENABLED-FIELDS</code> - the keyword index displays this as
* "ENABLED-FIELDS" (with the double quotes) and this is noted as
* an option to the validate() method; testing has shown that this
* is a string literal NOT a real keyword (if you take the double
* quotes away you get a compiler error so this is not really a
* keyword)
* <li><code>SET-CURRENT-VALUE</code> - this is a possible value
* returned inside a string from the <code>DBRESTRICTIONS</code>
* built-in function but this can't appear in directly (unquoted)
* in 4GL source so this is NOT a real keyword
* </ul>
* <p>
* Progress is so over-the-top keyword intensive that they sometimes have
* multiple forms of the same keyword (e.g. USER and USERID, WAIT and
* WAIT-FOR, GETBYTE and GET-BYTE). These are not abbreviations but just
* synonyms that require separate entries in the keyword index. The key
* point is that they will both resolve to the same token type (e.g.
* WAIT and WAIT-FOR both resolve to KW_WAIT_FOR). The order of these
* in the list will determine what "standard text" will be found when
* using a reverse text lookup (lookup of the text for a keyword based on
* its token type). In particular, the LAST entry to be added will be the
* "canonical" text returned from a reverse lookup. This affects reports
* and other features. Always order these with the most common form of
* the keyword as the last entry in the keyword index. So WAIT-FOR must
* follow WAIT in the list to ensure that the reverse lookup of
* KW_WAIT_FOR would return the text WAIT-FOR instead of WAIT.
*/
static
{
keywords = new Keyword[]
{
/* format: Full Keyword Text (lowercased) Abr Token Type Reserved */
new Keyword("_polymorphic_" , 0, KW_POLY , false), // FWD extension, not real 4GL!
new Keyword("_cbit" , 0, KW_CBIT , false), // undocumented
new Keyword("_control" , 0, KW_U_CTRL , true ), // undocumented
new Keyword("_msg" , 0, KW_U_MSG , true ), // undocumented
new Keyword("_pcontrol" , 0, KW_U_PCTRL , true ), // undocumented
new Keyword("_serial-num" , 7, KW_U_SERIAL, true ), // undocumented
new Keyword("abort" , 0, KW_ABORT , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("absolute" , 3, KW_ABS , false),
new Keyword("abstract" , 0, KW_ABSTRACT, false),
new Keyword("accelerator" , 0, KW_ACCEL , false),
new Keyword("accept-changes" , 0, KW_ACC_CHG , false), // missing from keyword index and UNTESTED at this time
new Keyword("accept-row-changes" , 0, KW_ACC_RCHG, false), // missing from keyword index and UNTESTED at this time
new Keyword("accumulate" , 5, KW_ACCUM , true ), // handles "separate keyword" accum too
new Keyword("activate" , 0, KW_ACTIVATE, false), // FWD extension, not a real 4GL keyword
new Keyword("active" , 0, KW_ACTIVE , false), // missing from keyword index and UNTESTED at this time
new Keyword("active-form" , 0, KW_ACT_FORM, true ),
new Keyword("active-window" , 0, KW_ACT_WIN , true ),
new Keyword("actor" , 0, KW_ACTOR , false), // missing from keyword index and UNTESTED at this time
new Keyword("add" , 0, KW_ADD , true ),
new Keyword("add-bcc-address" , 0, KW_ADD_BCCA, false), // FWD extension, not a real 4GL keyword
new Keyword("add-buffer" , 0, KW_ADD_BUF , false),
new Keyword("add-calc-column" , 0, KW_ADD_C_C , false),
new Keyword("add-cc-address" , 0, KW_ADD_CC_A, false), // FWD extension, not a real 4GL keyword
new Keyword("add-chart" , 0, KW_RPT_ADDC, false), // FWD extension, not real 4GL; export Jasper report to csv
new Keyword("add-child-node" , 0, KW_ADD_C_N , false), // FWD extension, not a real 4GL keyword
new Keyword("add-columns-from" , 0, KW_ADD_C_F , false),
new Keyword("add-events-procedure" , 0, KW_ADD_EVTP, false),
new Keyword("add-fields-from" , 0, KW_ADD_F_F , false),
new Keyword("add-first" , 0, KW_ADD_1ST , false),
new Keyword("add-first-node" , 0, KW_ADD_F_N , false), // FWD extension, not a real 4GL keyword
new Keyword("add-header-entry" , 0, KW_ADD_HENT, false), // missing from keyword index and UNTESTED at this time
new Keyword("add-image" , 0, KW_ADD_IMG , false), // FWD extension, not a real 4GL keyword
new Keyword("add-index-field" , 0, KW_ADD_IDXF, false),
new Keyword("add-interval" , 0, KW_ADD_INVL, false), // missing from keyword index and UNTESTED at this time
new Keyword("add-last" , 0, KW_ADD_LAST, false),
new Keyword("add-last-node" , 0, KW_ADD_L_N , false), // FWD extension, not a real 4GL keyword
new Keyword("add-like-column" , 0, KW_ADD_L_C , false),
new Keyword("add-like-field" , 0, KW_ADD_LIKF, false),
new Keyword("add-like-index" , 0, KW_ADD_LIKI, false),
new Keyword("add-new-field" , 0, KW_ADD_NEWF, false),
new Keyword("add-new-index" , 0, KW_ADD_NEWI, false),
new Keyword("add-next-node" , 0, KW_ADD_N_N , false), // FWD extension, not a real 4GL keyword
new Keyword("add-parent-id-relation" , 0, KW_ADD_PREL, false), // missing from keyword index and UNTESTED at this time
new Keyword("add-relation" , 0, KW_ADD_REL , false), // missing from keyword index and UNTESTED at this time
new Keyword("add-schema-location" , 0, KW_ADD_SLOC, false),
new Keyword("add-source-buffer" , 0, KW_ADD_SRCB, false), // missing from keyword index and UNTESTED at this time
new Keyword("add-super-procedure" , 14, KW_ADD_SUP , false), // undocumented abbreviation (keyword is in the 4GL keyword index but no abbreviation is listed)
new Keyword("add-tab" , 0, KW_ADD_TAB , false), // FWD extension, not a real 4GL keyword
new Keyword("add-to-address" , 0, KW_ADD_TO_A, false), // FWD extension, not a real 4GL keyword
new Keyword("adm-data" , 0, KW_ADM_DATA, false),
new Keyword("adm-timing-out" , 0, KW_ADM_TO , false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("advise" , 0, KW_ADVISE , false),
new Keyword("after-buffer" , 0, KW_AFT_BUFF, false), // missing from keyword index and UNTESTED at this time
new Keyword("after-fill" , 0, KW_AFT_FILL, false), // missing from keyword index and UNTESTED at this time
new Keyword("after-label-edit" , 0, KW_N_AEDIT , false), // FWD extension, not a real 4GL keyword
new Keyword("after-row-fill" , 0, KW_AFT_R_F , false), // missing from keyword index and UNTESTED at this time
new Keyword("after-rowid" , 0, KW_AFT_ROID, false), // missing from keyword index and UNTESTED at this time
new Keyword("after-table" , 0, KW_AFT_TBL , false),
new Keyword("alert-box" , 0, KW_ALERT_BX, false),
new Keyword("alias" , 0, KW_ALIAS , true ),
new Keyword("alignment" , 0, KW_ALIGN , false), // FWD extension, not a real 4GL keyword
new Keyword("all" , 0, KW_ALL , true ),
new Keyword("allow-column-searching" , 0, KW_ALLW_C_S, false),
new Keyword("allow-replication" , 0, KW_ALLW_REP, false),
new Keyword("alter" , 0, KW_ALTER , true ),
new Keyword("alternate-key" , 0, KW_ALT_KEY , false),
new Keyword("always-on-top" , 0, KW_ALW_ON_T, false),
new Keyword("ambiguous" , 5, KW_AMBIG , true ),
new Keyword("analyze" , 6, KW_ANALYZ , true ), // totally undocumented
new Keyword("and" , 0, KW_AND , true ),
new Keyword("ansi-only" , 0, KW_ANSI_ONL, false),
new Keyword("any" , 0, KW_ANY , true ),
new Keyword("any-key" , 0, KW_ANY_KEY , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("any-printable" , 0, KW_ANY_PRT , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("anywhere" , 0, KW_ANYWHERE, false),
new Keyword("append" , 0, KW_APPEND , false),
new Keyword("append-child" , 0, KW_APPEND_C, false),
new Keyword("append-line" , 0, KW_APPEND_L, false), // missing in keyword index, found in customer source
new Keyword("appl-alert-boxes" , 10, KW_APPL_A_B, false),
new Keyword("appl-context-id" , 0, KW_APPL_CID, false),
new Keyword("application" , 0, KW_APPL , false),
new Keyword("apply" , 0, KW_APPLY , true ),
new Keyword("apply-callback" , 0, KW_APPL_CBK, false), // missing from keyword index and UNTESTED at this time
new Keyword("appserver-info" , 0, KW_APP_INFO, false),
new Keyword("appserver-password" , 0, KW_APP_PW , false),
new Keyword("appserver-userid" , 0, KW_APP_UID , false),
new Keyword("array-message" , 0, KW_ARR_MSG , false),
new Keyword("as" , 0, KW_AS , true ),
new Keyword("as-thread" , 0, KW_AS_THRD , false), // FWD extension, not a real 4GL keyword
new Keyword("ascending" , 3, KW_ASC , true ), // ASC is documented as a separate non-reserved keyword, but in fact it is reserved AND ASCENDING can be used as a complete synonym
new Keyword("asciitohtml" , 0, KW_ASCII_2H, false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("ask-overwrite" , 0, KW_ASK_OVER, false),
new Keyword("assembly" , 0, KW_ASSEMBLY, false),
new Keyword("assign" , 0, KW_ASSIGN , true ),
new Keyword("asterisk-active" , 0, KW_AST_ACTI, false), // FWD extension, not a real 4GL keyword
new Keyword("asynchronous" , 0, KW_ASYNC , true ),
new Keyword("async-request-count" , 0, KW_ASYNC_RC, false),
new Keyword("async-request-handle" , 0, KW_ASYNC_RH, false),
new Keyword("at" , 0, KW_AT , true ),
new Keyword("at-web-browser" , 0, KW_AT_W_BRW, false), // FWD extension, not a real 4GL keyword
new Keyword("attach-data-source" , 0, KW_ATT_DSRC, false), // missing from keyword index and UNTESTED at this time
new Keyword("attach-file" , 0, KW_ATT_FILE, false), // FWD extension, not a real 4GL keyword
new Keyword("attach-url" , 0, KW_ATT_URL , false), // FWD extension, not a real 4GL keyword
new Keyword("attached-pairlist" , 0, KW_ATT_PLST, false),
new Keyword("attr-space" , 4, KW_ATTR , true ),
new Keyword("attribute-names" , 0, KW_ATTR_NAM, false),
new Keyword("audit-control" , 0, KW_AUD_CTRL, true ),
new Keyword("audit-enabled" , 0, KW_AUD_ENAB, false),
new Keyword("audit-event-context" , 0, KW_AUD_EV_C, false),
new Keyword("audit-policy" , 0, KW_AUD_POL , true ),
new Keyword("auth-blob" , 0, KW_AUTHBLOB, false), // FWD extension, not a real 4GL keyword
new Keyword("authentication-failed" , 0, KW_AUTHEN_F, false),
new Keyword("authorization" , 0, KW_AUTHORZN, true ),
new Keyword("auto-completion" , 9, KW_AUTO_COM, false),
new Keyword("auto-delete" , 0, KW_AUTO_DEL, false), // missing from keyword index and UNTESTED at this time
new Keyword("auto-delete-xml" , 0, KW_AUTO_D_X, false), // missing in keyword index, found elsewhere in lang ref
new Keyword("auto-end-key" , 0, KW_AUTO_END, false),
new Keyword("auto-endkey" , 0, KW_AUTO_END, false),
new Keyword("auto-go" , 0, KW_AUTO_GO , false),
new Keyword("auto-indent" , 8, KW_AUTO_IND, false),
new Keyword("auto-resize" , 0, KW_AUTO_RES, false),
new Keyword("auto-return" , 8, KW_AUTO_RET, true ),
new Keyword("auto-synchronize" , 0, KW_AUTO_SYN, false),
new Keyword("auto-validate" , 8, KW_AUTO_VAL, false),
new Keyword("auto-zap" , 6, KW_AUTO_ZAP, false),
new Keyword("automatic" , 0, KW_AUTOMATC, false),
new Keyword("available" , 5, KW_AVAIL , true ),
new Keyword("available-formats" , 0, KW_AVL_FMTS, false),
new Keyword("available-messages" , 0, KW_AVL_MSGS, false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("average" , 3, KW_AVERAGE , false),
new Keyword("avg" , 0, KW_AVG , false),
new Keyword("background" , 4, KW_BACKGRND, true ),
new Keyword("backspace" , 0, KW_BACKSP , false),
new Keyword("backwards" , 8, KW_BACKWARD, false),
new Keyword("back-tab" , 0, KW_BACK_TAB, false),
new Keyword("basic-logging" , 0, KW_BAS_LOGG, false), // missing from keyword index and UNTESTED at this time
new Keyword("base64-decode" , 0, KW_BASE64_D, false),
new Keyword("base64-encode" , 0, KW_BASE64_E, false),
new Keyword("base-ade" , 0, KW_BASE_ADE, false),
new Keyword("base-key" , 0, KW_BASE_KEY, false),
new Keyword("batch-mode" , 5, KW_BATCH_MO, false),
new Keyword("batch-size" , 0, KW_BATCH_SZ, false),
new Keyword("before-buffer" , 0, KW_B4_BUFF , false), // missing from keyword index and UNTESTED at this time
new Keyword("before-fill" , 0, KW_B4_FILL , false), // missing from keyword index and UNTESTED at this time
new Keyword("before-hide" , 8, KW_B4_HIDE , true ),
new Keyword("before-label-edit" , 0, KW_N_BEDIT , false), // FWD extension, not a real 4GL keyword
new Keyword("before-row-fill" , 0, KW_B4_R_F , false), // missing from keyword index and UNTESTED at this time
new Keyword("before-rowid" , 0, KW_B4_ROWID, false), // missing from keyword index and UNTESTED at this time
new Keyword("before-table" , 0, KW_B4_TABLE, false),
new Keyword("begin-event-group" , 0, KW_BEG_EV_G, false),
new Keyword("begins" , 0, KW_BEGINS , true ),
new Keyword("bell" , 0, KW_BELL , true ),
new Keyword("between" , 0, KW_BETWEEN , true ),
new Keyword("bgcolor" , 3, KW_BGCOLOR , false),
new Keyword("bgcolor-rgb" , 0, KW_BGCOLRGB, false), // FWD extension, not real 4GL!
new Keyword("big-endian" , 0, KW_B_ENDIAN, true ),
new Keyword("binary" , 0, KW_BINARY , false),
new Keyword("bind" , 0, KW_BIND , false),
new Keyword("bind-where" , 0, KW_BIND_WH , false),
new Keyword("blank" , 0, KW_BLANK , true ),
new Keyword("blob" , 0, KW_BLOB , false), // missing from keyword index and UNTESTED at this time
new Keyword("block" , 0, KW_BLOCK , false), // missing in keyword index, found in prog handbook as a key function
new Keyword("block-iteration-display" , 0, KW_BLK_IT_D, false),
new Keyword("block-level" , 9, KW_BLK_LVL , false),
new Keyword("border-bottom-chars" , 8, KW_BORD_B_C, false),
new Keyword("border-bottom-pixels" , 15, KW_BORD_B_P, false),
new Keyword("border-left-chars" , 8, KW_BORD_L_C, false),
new Keyword("border-left-pixels" , 13, KW_BORD_L_P, false),
new Keyword("border-right-chars" , 8, KW_BORD_R_C, false),
new Keyword("border-right-pixels" , 14, KW_BORD_R_P, false),
new Keyword("border-top-chars" , 8, KW_BORD_T_C, false),
new Keyword("border-top-pixels" , 12, KW_BORD_T_P, false),
new Keyword("both" , 0, KW_BOTH , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("bottom" , 0, KW_BOTTOM , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("bottom-column" , 0, KW_BOTTOM_C, false), // missing in keyword index, found in prog handbook as a key function
new Keyword("box" , 0, KW_BOX , false),
new Keyword("box-selectable" , 10, KW_BOX_SEL , false),
new Keyword("break" , 0, KW_BREAK , true ),
new Keyword("break-line" , 0, KW_BREAK_L , false), // missing in keyword index, found in prog handbook as a key function
new Keyword("browse" , 0, KW_BROWSE , false),
new Keyword("browser-external-ip" , 0, KW_BR_IP , false), // FWD extension, not a real 4GL keyword
new Keyword("browser-port" , 0, KW_BR_PORT , false), // FWD extension, not a real 4GL keyword
new Keyword("browser-timezone" , 0, KW_BR_TZ , false), // FWD extension, not a real 4GL keyword
new Keyword("btos" , 0, KW_BTOS , true ), // undocumented
new Keyword("buffer" , 0, KW_BUFFER , false),
new Keyword("buffer-chars" , 0, KW_BUFFER_C, false),
new Keyword("buffer-compare" , 11, KW_BUF_COMP, true ), // this is reserved and has an abbreviation even though the documentation states it should be otherwise
new Keyword("buffer-copy" , 0, KW_BUF_COPY, true ), // this is reserved even though the documentation states it should be otherwise
new Keyword("buffer-create" , 0, KW_BUF_CREA, false),
new Keyword("buffer-delete" , 0, KW_BUF_DEL , false),
new Keyword("buffer-field" , 0, KW_BUF_FLD , false),
new Keyword("buffer-group-id" , 0, KW_BUF_GRPI, false), // missing in keyword index, found elsewhere in lang ref, untested at this time
new Keyword("buffer-group-name" , 0, KW_BUF_GRPN, false), // missing in keyword index, found elsewhere in lang ref, untested at this time
new Keyword("buffer-handle" , 0, KW_BUF_HNDL, false),
new Keyword("buffer-lines" , 0, KW_BUFFER_L, false),
new Keyword("buffer-name" , 0, KW_BUF_NAME, false),
new Keyword("buffer-partition-id" , 0, KW_BUF_PARI, false),
new Keyword("buffer-release" , 0, KW_BUF_REL , false),
new Keyword("buffer-tenant-id" , 0, KW_BUF_TENI, false), // missing in keyword index, found elsewhere in lang ref, untested at this time
new Keyword("buffer-tenant-name" , 0, KW_BUF_TENN, false), // missing in keyword index, found elsewhere in lang ref, untested at this time
new Keyword("buffer-validate" , 0, KW_BUF_VLID, false), // missing from keyword index and UNTESTED at this time
new Keyword("buffer-value" , 0, KW_BUF_VAL , false),
new Keyword("building-tree" , 0, KW_BUILD_TR, false), // FWD extension, not a real 4GL keyword
new Keyword("button-list" , 0, KW_BTN_LIST, false), // FWD ext. BUTTON-LIST extension, not a real 4GL keyword
new Keyword("currentgroup" , 0, KW_BL_CURGR, false), // FWD ext. Attr: ButtonList:CurrentGroup
new Keyword("currentgroup-key" , 0, KW_BL_CGR_K, false), // FWD ext. Attr: ButtonList:CurrentGroup-Key
new Keyword("buttonfont" , 0, KW_BL_BTNFN, false), // FWD ext. Attr: ButtonList:ButtonFont
new Keyword("itemfont" , 0, KW_BL_ITMFN, false), // FWD ext. Attr: ButtonList:ItemFont
new Keyword("clear-buttonlist" , 9, KW_BL_GCLR , false), // FWD ext. Method: ButtonList:Clear-ButtonList
new Keyword("add-group" , 0, KW_BL_GADD , false), // FWD ext. Method: ButtonList:Add-Group
new Keyword("item-fromposition" , 6, KW_BL_GIFP , false), // FWD ext. Method: ButtonListGroup:Item-FromPosition
new Keyword("add-item" , 0, KW_BL_IADD , false), // FWD ext. Method: ButtonListGroup:Add-Item
new Keyword("get-group" , 0, KW_BL_G_GR , false), // FWD ext. Method: ButtonList:Get-Group
new Keyword("get-group-item" , 0, KW_BL_G_GRI, false), // FWD ext. Method: ButtonListGroup:Get-Group-Item
new Keyword("group-key" , 0, KW_BL_G_KEY, false), // FWD ext. Attr: ButtonListGroup:Group-Key
new Keyword("item-key" , 0, KW_BL_GIKEY, false), // FWD ext. Attr: ButtonListGroupItem:Item-Key
new Keyword("num-groups" , 0, KW_BL_NGR , false), // FWD ext. Attr: ButtonList:Num-Groups
new Keyword("num-group-items" , 0, KW_BL_NGRI , false), // FWD ext. Attr: ButtonListGroup:Num-Group-Items
new Keyword("buttons" , 6, KW_BUTTON , false), // handles "separate keyword" button too
new Keyword("by" , 0, KW_BY , true ),
new Keyword("by-pointer" , 0, KW_BY_PTR , false),
new Keyword("by-reference" , 0, KW_BY_REF , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("by-value" , 0, KW_BY_VALUE, false), // missing in keyword index, found elsewhere in lang ref
new Keyword("by-variant-pointer" , 0, KW_BY_VAR_P, false),
new Keyword("byte" , 0, KW_BYTE , false), // missing in keyword index, found elsewhere in external program interface ref
new Keyword("bytes-read" , 0, KW_BYTES_R , false),
new Keyword("bytes-written" , 0, KW_BYTES_W , false),
new Keyword("cache" , 0, KW_CACHE , false),
new Keyword("cache-size" , 0, KW_CACHE_SZ, false),
new Keyword("calendar" , 0, KW_CALENDAR, false), // FWD CALENDAR extension, not a real 4GL keyword
new Keyword("calendarbackcolor" , 0, KW_CALBGCLR, false), // FWD CALENDAR extension
new Keyword("calendarforecolor" , 0, KW_CALFGCLR, false), // FWD CALENDAR extension
new Keyword("calendarvalue" , 0, KW_CALVALUE, false), // CALENDAR:CalendarValue extension
new Keyword("call" , 0, KW_CALL , true ),
new Keyword("call-name" , 0, KW_CALL_NAM, false),
new Keyword("call-type" , 0, KW_CALL_TYP, false),
new Keyword("cancel-break" , 0, KW_CANC_BRK, false),
new Keyword("callback" , 0, KW_CALLBACK, false), // FWD TIMER extension
new Keyword("cancel-button" , 0, KW_CANCEL_B, false),
new Keyword("cancel-pick" , 0, KW_CANCEL_P, false), // missing in keyword index, found in prog handbook as a key function
new Keyword("cancel-requests" , 0, KW_CANCEL_R, false),
new Keyword("cancelled" , 0, KW_CANCELLD, false),
new Keyword("can-create" , 0, KW_CAN_CREA, false),
new Keyword("can-delete" , 0, KW_CAN_DEL , false),
new Keyword("can-do" , 0, KW_CAN_DO , true ),
new Keyword("can-dump" , 0, KW_CAN_DUMP, true ),
new Keyword("can-find" , 0, KW_CAN_FIND, true ),
new Keyword("can-load" , 0, KW_CAN_LOAD, true ),
new Keyword("can-query" , 0, KW_CAN_QRY , false),
new Keyword("can-read" , 0, KW_CAN_READ, false),
new Keyword("can-set" , 0, KW_CAN_SET , false),
new Keyword("can-write" , 0, KW_CAN_WRT , false),
new Keyword("upper" , 0, KW_CAPS , false), // missing in keyword index, found elsewhere in SQL ref
new Keyword("caps" , 0, KW_CAPS , false),
new Keyword("captionfont" , 0, KW_CAPFNT , false), // FWD extension, WithCaption:CAPTIONFONT
new Keyword("captionfont-size" , 0, KW_CAPFNTSZ, false), // FWD extension, WithCaption:CAPTIONFONT-SIZE
new Keyword("careful-paint" , 0, KW_CARE_PNT, false),
new Keyword("case" , 0, KW_CASE , true ),
new Keyword("case-sensitive" , 8, KW_CASE_SEN, true ),
new Keyword("cast" , 0, KW_CAST , true ),
new Keyword("catch" , 0, KW_CATCH , false),
new Keyword("cdecl" , 0, KW_CDECL , false),
new Keyword("cease" , 0, KW_CEASE , false), // FWD TIMER extension
new Keyword("centered" , 6, KW_CENTER , true ),
new Keyword("chained" , 0, KW_CHAINED , false),
new Keyword("change-node-direct" , 0, KW_C_NOD_D , false), // FWD extension, not a real 4GL keyword
new Keyword("change-top-visible-node" , 0, KW_C_T_V_N , false), // FWD extension, not a real 4GL keyword
new Keyword("character" , 4, KW_CHAR , false),
new Keyword("character_length" , 0, KW_CHAR_LEN, false), // possible SQL keyword in the keyword index but no reference found in the SQL 89 reference
new Keyword("charset" , 0, KW_CHARSET , false),
new Keyword("chart" , 0, KW_CHART , false), // FWD extension, not a real 4GL keyword
new Keyword("chart-add-picture" , 0, KW_RPT_CAP , false), // FWD extension, not real 4GL; export Jasper report to csv
new Keyword("checked" , 0, KW_CHECKED , false),
new Keyword("check" , 0, KW_CHECK , true ),
new Keyword("check-agent-mode" , 0, KW_CHECK_AM, false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("check-boxes" , 0, KW_CHECK_BO, false), // FWD extension, not a real 4GL keyword
new Keyword("child-buffer" , 0, KW_CHLD_BUF, false), // missing from keyword index and UNTESTED at this time
new Keyword("clear-tabs" , 0, KW_CLR_TABS, false), // FWD extension, not a real 4GL keyword
new Keyword("current-tab" , 0, KW_CURR_TAB, false), // FWD extension, not a real 4GL keyword
new Keyword("choices" , 0, KW_CHOICES , false), // missing in keyword index, found in prog handbook as a key function
new Keyword("choose" , 0, KW_CHOOSE , false),
new Keyword("chr" , 0, KW_CHR , true ),
new Keyword("child-num" , 0, KW_CHLD_NUM, false),
new Keyword("class" , 0, KW_CLASS , false),
new Keyword("class-type" , 0, KW_CLS_TYPE, false),
new Keyword("clipboard" , 0, KW_CLIP , true ),
new Keyword("clear" , 0, KW_CLEAR , true ),
new Keyword("clear-all" , 0, KW_CLR_ALL , false), // FWD extension, not a real 4GL keyword
new Keyword("clear-appl-context" , 0, KW_CLR_AP_C, false),
new Keyword("clear-attachments-list" , 0, KW_CLR_ATTL, false), // FWD extension, not a real 4GL keyword
new Keyword("clear-bcc-list" , 0, KW_CLR_BCCL, false), // FWD extension, not a real 4GL keyword
new Keyword("clear-cc-list" , 0, KW_CLR_CC_L, false), // FWD extension, not a real 4GL keyword
new Keyword("clear-embedded-image-list" , 0, KW_CLR_EMBL, false), // FWD extension, not a real 4GL keyword
new Keyword("clear-log" , 0, KW_CLR_LOG , false),
new Keyword("clear-nodes" , 0, KW_CLR_NODS, false), // FWD extension, not a real 4GL keyword
new Keyword("clear-selection" , 12, KW_CLR_SEL , false),
new Keyword("clear-sort-arrows" , 16, KW_CLR_S_AR, false),
new Keyword("cleartablet" , 0, KW_CLEA_TAB, false), // FWD extension, not a real 4GL keyword
new Keyword("clearsigwindow" , 0, KW_CLEA_WIN, false), // FWD extension, not a real 4GL keyword
new Keyword("client-connection-id" , 0, KW_CLNT_C_I, false),
new Keyword("client-disconnected" , 0, KW_CLNT_DIS, false), // FWD extension, not a real 4GL keyword
new Keyword("client-principal" , 0, KW_CLNT_PRL, false),
new Keyword("clear-to-list" , 0, KW_CLR_TO_L, false), // FWD extension, not a real 4GL keyword
new Keyword("client-external-ip" , 0, KW_CLN_IP , false), // FWD extension, not a real 4GL keyword
new Keyword("client-port" , 0, KW_CLN_PORT, false), // FWD extension, not a real 4GL keyword
new Keyword("client-timezone" , 0, KW_CLN_TZ , false), // FWD extension, not a real 4GL keyword
new Keyword("client-ip-capture-time" , 0, KW_CLN_TIME, false), // FWD extension, not a real 4GL keyword
new Keyword("client-tty" , 0, KW_CLNT_TTY, false),
new Keyword("client-type" , 0, KW_CLNT_TYP, false),
new Keyword("client-workstation" , 0, KW_CLNT_WS , false),
new Keyword("clob" , 0, KW_CLOB , false), // missing from keyword index and UNTESTED at this time
new Keyword("clone-node" , 0, KW_CLONE_ND, false),
new Keyword("close" , 0, KW_CLOSE , false),
new Keyword("close-log" , 0, KW_CLOSE_LG, false),
new Keyword("closeallprocs" , 0, KW_CLOSE_AP, false), // missing in keyword index, found elsewhere in lang ref
new Keyword("clear-node-image-list" , 0, KW_CLR_NIML, false), // FWD extension, not a real 4GL keyword
new Keyword("cancel-requests-after" , 0, KW_CNCL_R_A, false),
new Keyword("code" , 0, KW_CODE , false),
new Keyword("codebase-locator" , 0, KW_CODEBASE, true ),
new Keyword("codepage-convert" , 0, KW_CP_CVT , false),
new Keyword("codepage" , 0, KW_CP , false),
new Keyword("col-of" , 0, KW_COL_OF , false),
new Keyword("collapse-all" , 0, KW_COLL_ALL, false), // FWD extension, not a real 4GL keyword
new Keyword("collapse-all-except" , 0, KW_COLL_A_E, false), // FWD extension, not a real 4GL keyword
new Keyword("collapse-node" , 0, KW_COL_NODE, false), // FWD extension, not a real 4GL keyword
new Keyword("collate" , 0, KW_COLLATE , false),
new Keyword("colon" , 0, KW_COLON , true ),
new Keyword("colon-aligned" , 11, KW_COLON_AL, false),
new Keyword("color" , 0, KW_COLOR , true ),
new Keyword("color-table" , 0, KW_COLR_TAB, false),
new Keyword("column" , 3, KW_COL , false),
new Keyword("column-bgcolor" , 0, KW_COL_BGC , false),
new Keyword("column-codepage" , 0, KW_COL_CP , false), // missing from keyword index and UNTESTED at this time
new Keyword("column-dcolor" , 0, KW_COL_DC , false),
new Keyword("column-fgcolor" , 0, KW_COL_FGC , false),
new Keyword("column-font" , 0, KW_COL_FONT, false),
new Keyword("column-label" , 10, KW_COL_LAB , true ),
new Keyword("column-movable" , 0, KW_COL_MOV , false),
new Keyword("column-of" , 0, KW_COL_OF , false),
new Keyword("column-pfcolor" , 0, KW_COL_PFC , false),
new Keyword("column-read-only" , 0, KW_COL_R_O , false),
new Keyword("column-resizable" , 0, KW_COL_RES , false),
new Keyword("column-scrolling" , 0, KW_COL_SCR , false),
new Keyword("column-sorting" , 0, KW_COL_SRT , false),
new Keyword("columns" , 0, KW_COLUMNS , true ),
new Keyword("command" , 0, KW_COMMAND , false),
new Keyword("com-data" , 0, KW_COM_DATA, false), // FWD extension, not a real 4GL keyword
new Keyword("com-handle" , 0, KW_COM_HNDL, false), // missing in keyword index, found elsewhere in external program interface ref
new Keyword("com-self" , 0, KW_COM_SELF, false),
new Keyword("compare" , 0, KW_COMPARE , false),
new Keyword("compares" , 0, KW_COMPARES, false),
new Keyword("combo-box" , 0, KW_COMBO_BX, false),
new Keyword("compile" , 0, KW_COMPILE , false),
new Keyword("compiler" , 0, KW_COMPILER, true ),
new Keyword("complete" , 0, KW_COMPLETE, false),
new Keyword("component-handle" , 0, KW_COM_HNDL, false),
new Keyword("config-name" , 0, KW_CFG_NAME, false),
new Keyword("connect" , 0, KW_CONN , false),
new Keyword("connected" , 0, KW_CONN_ED , true ),
new Keyword("connection-type" , 0, KW_CONNTYPE, false), // FWD extension, not a real 4GL keyword
new Keyword("constructor" , 0, KW_CONSTRUC, false),
new Keyword("context" , 0, KW_CTX , false),
new Keyword("context-help" , 0, KW_CTX_H , false),
new Keyword("context-help-file" , 0, KW_CTX_H_F , false),
new Keyword("context-help-id" , 0, KW_CTX_H_ID, false),
new Keyword("context-popup" , 0, KW_CTX_POP , false),
new Keyword("contains" , 0, KW_CONTAINS, false),
new Keyword("contents" , 0, KW_CONTENTS, false),
new Keyword("context-path" , 0, KW_CTX_PATH, false), // FWD extension, not a real 4GL keyword
new Keyword("control" , 0, KW_CONTROL , true ),
new Keyword("control-box" , 0, KW_CNTRL_BX, false),
new Keyword("control-container" , 0, KW_CNTRL_FR, false), // missing in keyword index (and other API ref), found in customer code as a synonym
new Keyword("control-frame" , 0, KW_CNTRL_FR, false),
new Keyword("control-name" , 0, KW_CNTRL_NM, false), // missing in keyword index, found elsewhere in lang ref
new Keyword("controls" , 0, KW_CONTROLS, false), // missing in keyword index, found elsewhere in lang ref
new Keyword("convert" , 0, KW_CONVERT , false),
new Keyword("convert-datetime" , 0, KW_CVT_DT , false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("convert-to-offset" , 15, KW_CVT_2OFF, false),
new Keyword("convert-3d-colors" , 0, KW_CVT_3D_C, false),
new Keyword("cookie-date" , 0, KW_COOKIE_D, false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("copy" , 0, KW_COPY , false), // missing in keyword index, found in prog handbook as a key function
new Keyword("copy-dataset" , 0, KW_CPY_DSET, false),
new Keyword("copy-lob" , 0, KW_CPY_LOB , true ),
new Keyword("copy-sax-attributes" , 0, KW_CPY_SATR, false),
new Keyword("copy-temp-table" , 0, KW_CPY_TTBL, false),
new Keyword("count" , 0, KW_COUNT , false),
new Keyword("count-of" , 0, KW_COUNT_OF, true ),
new Keyword("coverage" , 0, KW_COVERAGE, false), // missing from keyword index, found in customer code and UNTESTED at this time
new Keyword("cpcase" , 0, KW_CPCASE , false),
new Keyword("cpcoll" , 0, KW_CPCOLL , false),
new Keyword("cpinternal" , 5, KW_CPINTERN, false), // undocumented abbreviation (keyword is in the 4GL keyword index but no abbreviation is listed)
new Keyword("cplog" , 0, KW_CPLOG , false),
new Keyword("cpprint" , 0, KW_CPPRINT , false),
new Keyword("cprcodein" , 0, KW_CPRCODEI, false),
new Keyword("cprcodeout" , 0, KW_CPRCODEO, false),
new Keyword("cpstream" , 0, KW_CPSTREAM, false),
new Keyword("cpterm" , 0, KW_CPTERM , false),
new Keyword("crc-value" , 0, KW_CRC_VAL , false),
new Keyword("create" , 0, KW_CREATE , true ),
new Keyword("create-column" , 0, KW_CRT_COL , false), // FWD extension, not a real 4GL keyword
new Keyword("create-image" , 0, KW_CRE_IMAG, false), // FWD extension, not a real 4GL keyword
new Keyword("create-like" , 0, KW_CREAT_LK, false),
new Keyword("create-like-sequential" , 0, KW_CR_LK_SQ, false),
new Keyword("create-on-add" , 0, KW_CREAT_OA, false), // missing from keyword index, found in customer code and UNTESTED at this time
new Keyword("create-merged-image" , 0, KW_CRT_MIMG, false), // FWD extension, not a real 4GL keyword
new Keyword("create-node" , 0, KW_CREAT_ND, false),
new Keyword("create-node-namespace" , 0, KW_CREAT_NN, false),
new Keyword("create-result-list-entry" , 0, KW_CREAT_RL, false),
new Keyword("create-sub-node" , 0, KW_CREAT_SN, false), // FWD extension, not a real 4GL keyword
new Keyword("create-test-file" , 0, KW_CREAT_TF, false),
new Keyword("ctos" , 0, KW_CTOS , true ), // undocumented
new Keyword("currency" , 0, KW_CURRENCY, false), // missing in keyword index, found elsewhere in lang ref
new Keyword("current" , 0, KW_CURRENT , true ),
new Keyword("current-changed" , 0, KW_CUR_CHG , true ),
new Keyword("current-column" , 0, KW_CUR_COL , false),
new Keyword("current-environment" , 11, KW_CUR_ENV , false),
new Keyword("current-iteration" , 0, KW_CUR_ITER, false),
new Keyword("current-language" , 12, KW_CUR_LANG, true ),
new Keyword("current-result-row" , 0, KW_CUR_RES , false),
new Keyword("current-request-info" , 0, KW_CUR_RQI , false),
new Keyword("current-response-info" , 0, KW_CUR_RSI , false),
new Keyword("current-row-modified" , 0, KW_CUR_R_M , false),
new Keyword("current-window" , 0, KW_CUR_WIN , true ),
new Keyword("current-value" , 0, KW_CUR_VAL , false),
new Keyword("current-query" , 0, KW_CUR_QRY, false),
new Keyword("current_date" , 0, KW_CUR_DATE, false), // possible SQL keyword in the keyword index but no reference found in the SQL 89 reference
new Keyword("cursor" , 4, KW_CURSOR , true ),
new Keyword("cursor-char" , 0, KW_CUR_CHAR, false),
new Keyword("cursor-down" , 0, KW_CUR_DOWN, false), // missing in keyword index, found elsewhere in lang ref
new Keyword("cursor-left" , 0, KW_CUR_LEFT, false), // missing in keyword index, found elsewhere in lang ref
new Keyword("cursor-line" , 0, KW_CUR_LINE, false),
new Keyword("cursor-offset" , 0, KW_CUR_OFF , false),
new Keyword("cursor-right" , 0, KW_CUR_RGHT, false), // missing in keyword index, found elsewhere in lang ref
new Keyword("cursor-up" , 0, KW_CUR_UP , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("customformat" , 0, KW_CALCUFMT, false), // CALENDAR:CustomFormat extension
new Keyword("cut" , 0, KW_CUT , false), // missing in keyword index, found in prog handbook as a key function
new Keyword("data-bind" , 0, KW_DATA_BND, false),
new Keyword("data-entry-return" , 14, KW_DATA_E_R, false),
new Keyword("data-relation" , 0, KW_DATA_REL, false), // missing from keyword index and UNTESTED at this time
new Keyword("data-source" , 0, KW_DATA_SRC, true ),
new Keyword("data-source-complete-map" , 0, KW_DATA_SCM, false),
new Keyword("data-source-modified" , 0, KW_DATA_SM, false),
new Keyword("data-source-rowid" , 0, KW_DATA_SRI, false),
new Keyword("data-type" , 6, KW_DATATYPE, false),
new Keyword("database" , 0, KW_DATABASE, true ),
new Keyword("dataservers" , 0, KW_DATASRV , true ),
new Keyword("dataset" , 0, KW_DATASET , true ),
new Keyword("dataset-handle" , 0, KW_DSET_HND, true ),
new Keyword("date" , 0, KW_DATE , false),
new Keyword("datetime" , 0, KW_DATETIME, false), // missing from keyword index and UNTESTED at this time
new Keyword("datetime-tz" , 0, KW_DATE_TZ , false), // missing from keyword index and UNTESTED at this time
new Keyword("date-format" , 6, KW_DATE_FMT, false),
new Keyword("date-separator" , 0, KW_DATE_SEP, false), // FWD extension, not a real 4GL keyword
new Keyword("day" , 0, KW_DAY , false),
new Keyword("dbcodepage" , 0, KW_DBCP , true ),
new Keyword("dbcollation" , 0, KW_DBCOLL , true ),
new Keyword("dbname" , 0, KW_DBNAME , true ),
new Keyword("dbparam" , 0, KW_DBPARAM , true ),
new Keyword("db-context" , 0, KW_DB_CTXT , false),
new Keyword("db-filter-field-mapping" , 0, KW_FLTR_MAP, false), // FWD extension, not a real 4GL keyword.
new Keyword("db-list" , 0, KW_DB_LIST , false ), // missing in keyword index, found elsewhere in lang ref, tested
new Keyword("db-references" , 0, KW_DB_REF , false),
new Keyword("db-remote-host" , 0, KW_DB_REM_H, false), // missing in keyword index, found elsewhere in lang ref
new Keyword("db-sort-field-mapping" , 0, KW_SORT_MAP, false), // FWD extension, not a real 4GL keyword.
new Keyword("dbl-click-expanding" , 0, KW_DCLK_EXP, false), // FWD extension, not a real 4GL keyword
new Keyword("dbrestrictions" , 6, KW_DBREST , true ),
new Keyword("dbtaskid" , 0, KW_DBTASKID, true ),
new Keyword("dbtype" , 0, KW_DBTYPE , true ),
new Keyword("dbversion" , 6, KW_DBVERS , true ),
new Keyword("dcolor" , 0, KW_DCOLOR , false),
new Keyword("dde" , 0, KW_DDE , true ),
new Keyword("dde-error" , 0, KW_DDE_ERR , false),
new Keyword("dde-id" , 5, KW_DDE_ID , false),
new Keyword("dde-item" , 0, KW_DDE_ITEM, false),
new Keyword("dde-name" , 0, KW_DDE_NAME, false),
new Keyword("dde-notify" , 0, KW_DDE_NOTI, false), // missing in keyword index, found elsewhere in lang ref
new Keyword("dde-topic" , 0, KW_DDE_TOPI, false),
new Keyword("de-register" , 0, KW_DE_REGIS, false), // FWD extension, not a real 4GL keyword
new Keyword("deblank" , 0, KW_DEBLANK , true ),
new Keyword("debug" , 4, KW_DEBUG , false),
new Keyword("debugger" , 0, KW_DEBUGGER, true ),
new Keyword("debug-alert" , 0, KW_DBG_ALRT, false),
new Keyword("debug-list" , 0, KW_DBG_LST , true ),
new Keyword("decimal" , 3, KW_DEC , false),
new Keyword("decimal-separator" , 0, KW_DEC_SEP , false), // FWD extension, not a real 4GL keyword
new Keyword("decimals" , 0, KW_DECIMALS, true ),
new Keyword("declare" , 0, KW_DECLARE , true ),
new Keyword("declare-namespace" , 0, KW_DECL_NSP, false),
new Keyword("decrypt" , 0, KW_DECRYPT , false),
new Keyword("default" , 0, KW_DEFAULT , true ),
new Keyword("default-action" , 0, KW_DEF_ACTN, false), // missing in keyword index, found elsewhere in lang ref
new Keyword("default-buffer-handle" , 0, KW_DEF_BUFH, false),
new Keyword("default-button" , 9, KW_DEFLT_BN, false),
new Keyword("default-commit" , 0, KW_DEF_COMM, false),
new Keyword("default-extension" , 10, KW_DEF_EXTN, false),
new Keyword("default-noxlate" , 12, KW_DEF_NOXL, true ),
new Keyword("default-pop-up" , 0, KW_DEF_POP , false), // missing in keyword index, found in prog handbook as a key function
new Keyword("default-string" , 0, KW_DEF_STR , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("default-value" , 0, KW_DEF_VAL , false),
new Keyword("default-window" , 0, KW_DEF_WIN , true ),
new Keyword("define" , 3, KW_DEFINE , true ),
new Keyword("define-user-event-manager" , 0, KW_DEF_UEVM, false),
new Keyword("delegate" , 0, KW_DELEGATE, false),
new Keyword("delete" , 0, KW_DELETE , true ),
new Keyword("delete-character" , 11, KW_DEL_CHAR, false),
new Keyword("delete-column" , 0, KW_DEL_COL , false), // missing in keyword index, found in prog handbook as a key function
new Keyword("deletecookie" , 0, KW_DEL_COOK, false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("delete-cookie" , 0, KW_DEL_COOK, false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("delete-current-row" , 0, KW_DEL_C_R , false),
new Keyword("delete-end-line" , 0, KW_DEL_E_L , false), // missing in keyword index, found in prog handbook as a key function
new Keyword("delete-field" , 0, KW_DEL_FLD , false), // missing in keyword index, found in prog handbook as a key function
new Keyword("delete-header-entry" , 0, KW_DEL_H_EN, false), // missing from keyword index and UNTESTED at this time
new Keyword("delete-line" , 0, KW_DEL_LINE, false),
new Keyword("delete-node" , 0, KW_DEL_NODE, false),
new Keyword("delete-result-list-entry" , 0, KW_DEL_R_L , false),
new Keyword("delete-selected-row" , 0, KW_DEL_S_R , false),
new Keyword("delete-selected-rows" , 0, KW_DEL_S_RS, false),
new Keyword("delete-source" , 0, KW_DEL_S_C , false), // FWD extension
new Keyword("delete-word" , 0, KW_DEL_WORD, false), // missing in keyword index, found in prog handbook as a key function
new Keyword("descending" , 4, KW_DESCEND , true ), // handles "separate keyword" desc too
new Keyword("description" , 0, KW_DESCR , false), // missing in keyword index, found in customer code
new Keyword("deselect-focused-row" , 0, KW_DESEL_FR, false),
new Keyword("deselect-rows" , 0, KW_DESEL_R , false),
new Keyword("deselect-selected-row" , 0, KW_DESEL_SR, false),
new Keyword("deselection" , 0, KW_DESELCTN, false),
new Keyword("destructor" , 0, KW_DESTRUCT, false),
new Keyword("detach-data-source" , 0, KW_DET_DSRC, false), // missing from keyword index and UNTESTED at this time
new Keyword("device-id" , 0, KW_DEVICEID, false), // FWD extension, not a real 4GL keyword
new Keyword("dialog-box" , 0, KW_DIALOG , false),
new Keyword("dictionary" , 4, KW_DICT , true ),
new Keyword("dir" , 0, KW_DIR , false),
new Keyword("directory" , 0, KW_DIRECTRY, false), // missing in keyword index, found in customer code
new Keyword("delimiter" , 0, KW_DELIMIT , true ),
new Keyword("disable" , 0, KW_DISABLE , true ),
new Keyword("disable-auto-zap" , 0, KW_DIS_A_ZA, true ),
new Keyword("disable-cfg-edit" , 0, KW_DIS_CEDT, false), // FWD extension, not a real 4GL keyword.
new Keyword("disable-connections" , 0, KW_DISABL_C, false),
new Keyword("disable-dump-triggers" , 0, KW_DIS_D_TR, false),
new Keyword("disable-load-triggers" , 0, KW_DIS_L_TR, false),
new Keyword("disable-redraw" , 0, KW_DIS_REDR, false), // FWD extension, not real 4GL!
new Keyword("disable-row-striping" , 0, KW_DIS_STRP, false), // FWD extension, not a real 4GL keyword.
new Keyword("disabled" , 0, KW_DISABLED, false),
new Keyword("disconnect" , 6, KW_DISCONN , true ),
new Keyword("dispatch" , 0, KW_DISPATCH, false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("display" , 4, KW_DISP , true ),
new Keyword("display-message" , 0, KW_DISP_MSG, false),
new Keyword("display-timezone" , 0, KW_DISP_TZ , false), // missing from keyword index and UNTESTED at this time
new Keyword("display-type" , 9, KW_DISP_TYP, false),
new Keyword("distinct" , 0, KW_DISTINCT, true ),
new Keyword("dll-call-type" , 0, KW_DLL_C_T, true ),
new Keyword("do" , 0, KW_DO , true ),
new Keyword("domain-description" , 0, KW_DOMAIN_D, false),
new Keyword("domain-name" , 0, KW_DOMAIN_N, false),
new Keyword("domain-type" , 0, KW_DOMAIN_T, false),
new Keyword("dos" , 0, KW_DOS , true ),
new Keyword("double" , 0, KW_DOUBLE , false),
new Keyword("down" , 0, KW_DOWN , true ),
new Keyword("drag-drop" , 0, KW_DRAGDROP, false), // FWD extension, not a real 4GL keyword
new Keyword("drag-drop-other-tree" , 0, KW_DD_OTREE, false), // FWD extension, not a real 4GL keyword
new Keyword("drag-enabled" , 0, KW_DRAG_EN , false),
new Keyword("drop" , 0, KW_DROP , true ),
new Keyword("drop-down" , 0, KW_DROP_DWN, false),
new Keyword("drop-down-list" , 0, KW_DROP_LST, false),
new Keyword("drop-file-notify" , 0, KW_DROP_FN , false),
new Keyword("drop-target" , 0, KW_DROP_TAR, false),
new Keyword("dslog-manager" , 0, KW_DSL_MGR , false),
new Keyword("dump" , 0, KW_DUMP , false),
new Keyword("dump-logging-now" , 0, KW_DUMP_LGN, false), // missing from keyword index and UNTESTED at this time
new Keyword("dynamic-cast" , 0, KW_DYN_CAST, false), // missing from keyword index and UNTESTED at this time
new Keyword("dynamic-current-value" , 0, KW_DYN_CURV, false), // missing from keyword index and UNTESTED at this time
new Keyword("dynamic-enum" , 0, KW_DYN_ENUM, true ),
new Keyword("dynamic-function" , 12, KW_DYN_FUNC, true ), // undocumented abbreviation found in customer code
new Keyword("dynamic-invoke" , 0, KW_DYN_INVK, true ), // missing from keyword index, tested
new Keyword("dynamic-new" , 0, KW_DYN_NEW , true), // missing from keyword index, tested
new Keyword("dynamic-next-value" , 0, KW_DYN_NEXV, false), // missing from keyword index, tested
new Keyword("dynamic-property" , 0, KW_DYN_PROP, true), // missing from keyword index, tested
new Keyword("dynamic" , 0, KW_DYNAMIC , false),
new Keyword("each" , 0, KW_EACH , true ),
new Keyword("echo" , 0, KW_ECHO , false),
new Keyword("edge-chars" , 4, KW_EDGE_C , false),
new Keyword("edge-pixels" , 6, KW_EDGE_P , false),
new Keyword("edit-can-paste" , 0, KW_EDIT_C_P, false),
new Keyword("edit-can-undo" , 0, KW_EDIT_C_U, false),
new Keyword("edit-clear" , 0, KW_EDIT_CLR, false),
new Keyword("edit-copy" , 0, KW_EDIT_CPY, false),
new Keyword("edit-cut" , 0, KW_EDIT_CUT, false),
new Keyword("edit-paste" , 0, KW_EDIT_PAS, false),
new Keyword("edit-undo" , 0, KW_EDIT_UND, false),
new Keyword("editing" , 0, KW_EDITING , true ),
new Keyword("editor" , 0, KW_EDITOR , false),
new Keyword("editor-backtab" , 0, KW_EDIT_B_T, false), // missing in keyword index, found in prog handbook as a key function
new Keyword("editor-tab" , 0, KW_EDIT_TAB, false), // missing in keyword index, found elsewhere in prog handbook
new Keyword("else" , 0, KW_ELSE , true ),
new Keyword("embed-image-by-file" , 0, KW_EMB_FILE, false), // FWD extension, not a real 4GL keyword
new Keyword("embed-image-by-url" , 0, KW_EMB_URL , false), // FWD extension, not a real 4GL keyword
new Keyword("not-embedded" , 0, KW_NO_EMBED, false), // FWD extension
new Keyword("empty" , 0, KW_EMPTY , false),
new Keyword("empty-dataset" , 0, KW_EMPTY_DS, false), // missing from keyword index and UNTESTED at this time
new Keyword("empty-selection" , 0, KW_EMPTY_SN, false), // missing in keyword index, found elsewhere in lang ref
new Keyword("empty-temp-table" , 0, KW_EMPTY_TT, false),
new Keyword("enable" , 0, KW_ENABLE , true ),
new Keyword("enabled" , 0, KW_ENABLED , false), // FWD TIMER extension and PROFILER attribute
new Keyword("enable-connections" , 0, KW_ENABLE_C, false),
new Keyword("enable-events" , 0, KW_ENABLE_E, false), // missing in keyword index, found elsewhere in lang ref
new Keyword("encode" , 0, KW_ENCODE , true ),
new Keyword("encoding" , 0, KW_ENCODING, false),
new Keyword("encrypt" , 0, KW_ENCRYPT , false),
new Keyword("encrypt-audit-mac-key" , 0, KW_ENC_AMK , false),
new Keyword("encryption-salt" , 0, KW_ENC_SALT, false),
new Keyword("end-box-selection" , 0, KW_END_B_SN, false), // missing in keyword index, found elsewhere in lang ref
new Keyword("end-document" , 0, KW_END_DOC , false),
new Keyword("end-element" , 0, KW_END_ELEM, false),
new Keyword("end-event-group" , 0, KW_END_EV_G, false),
new Keyword("end-search" , 0, KW_END_SEAR, false), // missing in keyword index, found elsewhere in lang ref
new Keyword("end-user-prompt" , 0, KW_END_USER, false),
new Keyword("end" , 0, KW_END , true ),
new Keyword("end-error" , 0, KW_END_ERR , false),
new Keyword("end-file-drop" , 0, KW_END_F_D , false),
new Keyword("endkey" , 0, KW_ENDKEY , false),
new Keyword("end-key" , 0, KW_ENDKEY , false),
new Keyword("end-move" , 0, KW_END_MOV , false),
new Keyword("end-resize" , 0, KW_END_RESZ, false),
new Keyword("end-row-resize" , 0, KW_END_RRES, false),
new Keyword("enhanced-filtering" , 0, KW_EH_FL, false), // FWD extension, not a real 4GL keyword
new Keyword("enhanced-sorting" , 0, KW_EH_SR, false), // FWD extension, not a real 4GL keyword
new Keyword("ensure-node-visible" , 0, KW_ENS_N_V , false), // FWD extension, not a real 4GL keyword
new Keyword("entered" , 0, KW_ENTERED , false),
new Keyword("enter-menubar" , 0, KW_ENTER_MB, false), // missing in keyword index, found elsewhere in lang ref
new Keyword("entity-expansion-limit" , 0, KW_ENT_EX_L, false),
new Keyword("entry" , 0, KW_ENTRY , true ),
new Keyword("entry-types-list" , 0, KW_ENT_TLST, false), // missing from keyword index and UNTESTED at this time
new Keyword("enum" , 0, KW_ENUM , false ),
new Keyword("error" , 0, KW_ERROR , false),
new Keyword("error-code" , 0, KW_ERR_CODE, false), // missing in keyword index, found elsewhere in external program interface ref
new Keyword("error-column" , 9, KW_ERR_COL , false),
new Keyword("error-object-detail" , 0, KW_ERR_OBJD, false), // missing from keyword index and UNTESTED at this time
new Keyword("error-row" , 0, KW_ERR_ROW, false),
new Keyword("error-stack-trace" , 0, KW_ERR_S_T , false),
new Keyword("error-status" , 10, KW_ERR_STAT, true ),
new Keyword("error-string" , 0, KW_ERR_STR, false), // missing from keyword index and UNTESTED at this time
new Keyword("eq" , 0, KW_EQ , false),
new Keyword("escape" , 0, KW_ESCAPE , true ),
new Keyword("etime" , 0, KW_ETIME , true ),
new Keyword("events" , 5, KW_EVENTS , false),
new Keyword("events-active" , 0, KW_EVT_ACTI, false), // FWD extension, not a real 4GL keyword
new Keyword("event-group-id" , 0, KW_EVT_GRID, false),
new Keyword("event-procedure" , 0, KW_EVT_PROC, true ),
new Keyword("event-procedure-context" , 0, KW_E_PROC_C, false),
new Keyword("event-type" , 7, KW_EVT_TYPE, false),
new Keyword("except" , 0, KW_EXCEPT , true ),
new Keyword("exclusive-id" , 0, KW_EXCL_ID , false),
new Keyword("exclusive-lock" , 9, KW_EXC_LOCK, true ),
new Keyword("exclusive-web-user" , 0, KW_EXCL_WEB, false),
new Keyword("execute" , 0, KW_EXECUTE , false),
new Keyword("execution-log" , 0, KW_EXEC_LOG, false), // missing from keyword index and UNTESTED at this time
new Keyword("exists" , 0, KW_EXISTS , true ),
new Keyword("exit" , 0, KW_EXIT , false), // missing in keyword index, found in prog handbook as a key function
new Keyword("exit-code" , 0, KW_EXITCODE, false), // added in 11.7.3 as attribute to SESSION
new Keyword("exp" , 0, KW_EXP , false),
new Keyword("expand" , 0, KW_EXPAND , false),
new Keyword("expand-all" , 0, KW_EXPA_ALL, false), // FWD extension, not a real 4GL keyword
new Keyword("expand-node" , 0, KW_EXP_NODE, false), // FWD extension, not a real 4GL keyword
new Keyword("expand-node-icon" , 0, KW_EXP_N_IC, false), // FWD extension, not a real 4GL keyword
new Keyword("expand-on-enter" , 0, KW_EXP_ON_E, false), // FWD extension, not a real 4GL keyword
new Keyword("expand-on-single-click" , 0, KW_EXP_SCLK, false), // FWD extension, not a real 4GL keyword
new Keyword("expandable" , 0, KW_EXPANDBL, false),
new Keyword("explicit" , 0, KW_EXPLICIT, false),
new Keyword("export" , 0, KW_EXPORT , true ),
new Keyword("export-principal" , 0, KW_EXPORT_P, false),
new Keyword("export-report-csv" , 0, KW_RPT_CSV , false), // FWD extension, not real 4GL; export Jasper report to csv
new Keyword("export-report-docx" , 0, KW_RPT_DOCX, false), // FWD extension, not real 4GL; export Jasper report to xlsx
new Keyword("export-report-html" , 0, KW_RPT_HTML, false), // FWD extension, not real 4GL; export Jasper report to html
new Keyword("import-csv-data" , 0, KW_RPT_ICSV, false), // FWD extension, not real 4GL; export Jasper report to csv
new Keyword("export-report-pdf" , 0, KW_RPT_PDF , false), // FWD extension, not real 4GL; export Jasper report to pdf
new Keyword("export-report-rtf" , 0, KW_RPT_RTF , false), // FWD extension, not real 4GL; export Jasper report to xls
new Keyword("export-report-xls" , 0, KW_RPT_XLS , false), // FWD extension, not real 4GL; export Jasper report to xls
new Keyword("export-report-xlsx" , 0, KW_RPT_XLSX, false), // FWD extension, not real 4GL; export Jasper report to xlsx
new Keyword("extended" , 0, KW_EXTENDED, false),
new Keyword("extent" , 0, KW_EXTENT , false),
new Keyword("external" , 0, KW_EXTERN , false),
new Keyword("false" , 0, BOOL_FALSE , true ),
new Keyword("fetch" , 0, KW_FETCH , true ),
new Keyword("fetch-selected-row" , 0, KW_FETCH_SR, false),
new Keyword("fields" , 5, KW_FIELD , true ), // handles "separate keyword" field too
new Keyword("file" , 0, KW_FILE , false),
new Keyword("file-create-date" , 0, KW_FIL_C_D , false),
new Keyword("file-create-time" , 0, KW_FIL_C_T , false),
new Keyword("file-information" , 9, KW_FIL_INFO, true ),
new Keyword("file-mod-date" , 0, KW_FIL_M_D , false),
new Keyword("file-mod-time" , 0, KW_FIL_M_T , false),
new Keyword("file-name" , 0, KW_FIL_NAME, false),
new Keyword("file-offset" , 8, KW_FIL_OFF, false),
new Keyword("file-size" , 0, KW_FIL_SIZE, false),
new Keyword("file-type" , 0, KW_FIL_TYPE, false),
new Keyword("filename" , 0, KW_FIL_NAME, false),
new Keyword("fill" , 0, KW_FILL , true ),
new Keyword("fill-in" , 0, KW_FILL_IN , false),
new Keyword("fill-mode" , 0, KW_FILL_MOD, false), // missing from keyword index and UNTESTED at this time
new Keyword("fill-where-string" , 0, KW_FILL_WST, false), // missing from keyword index and UNTESTED at this time
new Keyword("filled" , 0, KW_FILLED , false),
new Keyword("filters" , 0, KW_FILTERS , false),
new Keyword("final" , 0, KW_FINAL , false),
new Keyword("finally" , 0, KW_FINALLY , false),
new Keyword("find" , 0, KW_FIND , true ),
new Keyword("find-by-rowid" , 0, KW_FIND_BR , false),
new Keyword("find-case-sensitive" , 0, KW_FIND_CS , true ),
new Keyword("find-current" , 0, KW_FIND_CUR, false),
new Keyword("find-failed" , 0, KW_FIND_FD , false), // missing from keyword index and UNTESTED at this time
new Keyword("find-first" , 0, KW_FIND_1ST, false),
new Keyword("find-global" , 0, KW_FIND_GLO, true ),
new Keyword("find-last" , 0, KW_FIND_LST, false),
new Keyword("find-next" , 0, KW_FIND_NXT, false), // missing in keyword index, found in prog handbook as a key function
new Keyword("find-next-occurrence" , 0, KW_FIND_NO , true ),
new Keyword("find-node" , 0, KW_FIND_NOD, false), // FWD extension, not a real 4GL keyword
new Keyword("find-previous" , 0, KW_FIND_PRV, false), // missing in keyword index, found in prog handbook as a key function
new Keyword("find-prev-occurrence" , 0, KW_FIND_PO , true ),
new Keyword("find-select" , 0, KW_FIND_SEL, true ),
new Keyword("find-unique" , 0, KW_FIND_UNI, false),
new Keyword("find-wrap-around" , 0, KW_FIND_WA , true ),
new Keyword("finder" , 0, KW_FINDER , false),
new Keyword("first" , 0, KW_FIRST , true ),
new Keyword("first-async-request" , 0, KW_FIRST_AR, false),
new Keyword("first-buffer" , 0, KW_FIRST_BU, false),
new Keyword("first-child" , 0, KW_FIRST_CH, false),
new Keyword("first-column" , 0, KW_FIRST_CO, false),
new Keyword("first-data-source" , 0, KW_FIRST_DS, false), // missing from keyword index and UNTESTED at this time
new Keyword("first-dataset" , 0, KW_FIR_DSET, false), // missing from keyword index and UNTESTED at this time
new Keyword("first-form" , 0, KW_FIRST_FM, false),
new Keyword("first-node" , 0, KW_FIRST_N , false), // FWD extension, not a real 4GL keyword
new Keyword("first-of" , 0, KW_FIRST_OF, true ),
new Keyword("first-object" , 0, KW_FIRST_OB, false),
new Keyword("first-procedure" , 10, KW_FIRST_PR, false),
new Keyword("first-query" , 0, KW_FIRST_QR, false), // missing from keyword index and UNTESTED at this time
new Keyword("first-server" , 0, KW_FIRST_SR, false),
new Keyword("first-server-socket" , 0, KW_FIRST_SS, false),
new Keyword("first-socket" , 0, KW_FIRST_SO, false),
new Keyword("first-tab-item" , 11, KW_FIRST_TI, false),
new Keyword("first-visible-node" , 0, KW_FV_NODE, false), // FWD extension, not a real 4GL keyword
new Keyword("fit-last-column" , 0, KW_FIT_LCOL, false),
new Keyword("fix-codepage" , 0, KW_FIX_CP , false), // missing from keyword index and UNTESTED at this time
new Keyword("fix-columns-left" , 0, KW_FIX_C_L , false), // FWD extension, not a real 4GL keyword
new Keyword("fixed-only" , 0, KW_FIXD_ONL, false),
new Keyword("fgcolor" , 3, KW_FGCOLOR , false),
new Keyword("fgcolor-rgb" , 0, KW_FGCOLRGB, false), // FWD extension, not real 4GL!
new Keyword("flags" , 0, KW_FLAGS , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("flat-button" , 0, KW_FLAT_BUT, false),
new Keyword("float" , 0, KW_FLOAT , false),
new Keyword("focus" , 0, KW_FOCUS , true ),
new Keyword("focus-and-select" , 0, KW_FOC_ASEL, false), // FWD extension, not a real 4GL keyword
new Keyword("focused-and-selected-node" , 0, KW_FS_NODE , false), // FWD extension, not a real 4GL keyword
new Keyword("focused-and-selected-node-key" , 0, KW_FS_NKEY , false), // FWD extension, not a real 4GL keyword
new Keyword("focused-node-key" , 0, KW_FOC_NKEY, false), // FWD extension, not a real 4GL keyword
new Keyword("focused-node" , 0, KW_FOC_NODE, false), // FWD extension, not a real 4GL keyword
new Keyword("focused-row" , 0, KW_FOCUS_R , false),
new Keyword("focused-row-selected" , 0, KW_FOCUS_RS, false),
new Keyword("font" , 0, KW_FONT , true ),
new Keyword("font-bold" , 0, KW_FNT_BOLD, false), // FWD extension, not a real 4GL keyword
new Keyword("font-italic" , 0, KW_FNT_ITAL, false), // FWD extension, not a real 4GL keyword
new Keyword("font-name" , 0, KW_FNT_NAME, false), // FWD extension, not a real 4GL keyword
new Keyword("font-size" , 0, KW_FNT_SIZE, false), // FWD extension, not a real 4GL keyword
new Keyword("font-table" , 0, KW_FONT_TAB, false),
new Keyword("font-underline" , 0, KW_FNT_UNDL, false), // FWD extension, not a real 4GL keyword
new Keyword("for" , 0, KW_FOR , true ),
new Keyword("force-database-join" , 0, KW_DB_JOIN , false),
new Keyword("force-file" , 0, KW_FORCE_F , false),
new Keyword("foreground" , 4, KW_FORE , false),
new Keyword("foreign-key-hidden" , 0, KW_F_KEY_H , false),
new Keyword("form-input" , 0, KW_FORM_INP, false),
new Keyword("form-long-input" , 0, KW_FORM_LIN, false),
new Keyword("format" , 4, KW_FORMAT , true ), // handles "separate keyword" form too
new Keyword("format-datetime" , 0, KW_FMT_DT , false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("formatstyle" , 0, KW_CALFMTST, false), // FWD extension for CALENDAR:FormatStyle, not a real 4GL keyword
new Keyword("formatted" , 8, KW_FORMATTE, false),
new Keyword("forward-only" , 0, KW_FWD_ONLY, false), // missing from keyword index and UNTESTED at this time
new Keyword("forwards" , 7, KW_FORWARD , false), // handles "separate keyword" forward too
new Keyword("fragment" , 7, KW_FRAGMENT, false),
new Keyword("frame" , 4, KW_FRAME , true ),
new Keyword("frame-col" , 0, KW_FR_COL , true ),
new Keyword("frame-db" , 0, KW_FR_DB , true ),
new Keyword("frame-down" , 0, KW_FR_DOWN , true ),
new Keyword("frame-field" , 0, KW_FR_FIELD, true ),
new Keyword("frame-file" , 0, KW_FR_FILE , true ),
new Keyword("frame-index" , 10, KW_FR_INDEX, true ),
new Keyword("frame-line" , 0, KW_FR_LINE , true ),
new Keyword("frame-name" , 0, KW_FR_NAME , true ),
new Keyword("frame-row" , 0, KW_FR_ROW , true ),
new Keyword("frame-spacing" , 9, KW_FR_SPACE, false),
new Keyword("frame-value" , 9, KW_FR_VAL , true ),
new Keyword("frame-x" , 0, KW_FR_X , false),
new Keyword("frame-y" , 0, KW_FR_Y , false),
new Keyword("from" , 0, KW_FROM , true ),
new Keyword("from-current" , 8, KW_FROM_CUR, false),
new Keyword("from-chars" , 6, KW_FROM_CHR, true ),
new Keyword("from-pixels" , 6, KW_FROM_PIX, true ),
new Keyword("frequency" , 0, KW_FREQ , false),
new Keyword("full-height-chars" , 11, KW_FULL_H_C, false),
new Keyword("full-height-pixels" , 13, KW_FULL_H_P, false),
new Keyword("full-width-chars" , 10, KW_FULL_W_C, false),
new Keyword("full-width-pixels" , 12, KW_FULL_W_P, false),
new Keyword("full-pathname" , 10, KW_FULLPATH, false),
new Keyword("function" , 0, KW_FUNCT , false),
new Keyword("function-call-type" , 0, KW_FUNC_C_T, true ),
new Keyword("fwd-logfile" , 0, KW_FWD_LOGF, false), // FWD extension, not real 4GL!
new Keyword("fwd-client-driver" , 0, KW_FWD_DRIV, false), // FWD extension, not real 4GL!
new Keyword("gateways" , 7, KW_GW , true ),
new Keyword("ge" , 0, KW_GTE , false),
new Keyword("generate-md5" , 0, KW_GEN_MD5 , false),
new Keyword("generate-pbe-key" , 0, KW_GEN_PBEK, false),
new Keyword("generate-pbe-salt" , 0, KW_GEN_PBES, false),
new Keyword("generate-random-key" , 0, KW_GEN_RNDK, false),
new Keyword("generate-uuid" , 0, KW_GEN_UUID, false),
new Keyword("get" , 0, KW_GET , false),
new Keyword("get-attachments-list" , 0, KW_GET_ATTL, false), // FWD extension, not a real 4GL keyword
new Keyword("get-attr-call-type" , 0, KW_GET_A_CT, true ),
new Keyword("getattribute" , 0, KW_GETATTRI, false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("get-attribute" , 0, KW_GET_ATTR, false),
new Keyword("get-attribute-node" , 0, KW_GET_A_N , false),
new Keyword("get-bcc-list" , 0, KW_GET_BCCL, false), // FWD extension, not a real 4GL keyword
new Keyword("get-binary-data" , 0, KW_GET_BDAT, false),
new Keyword("get-bits" , 0, KW_GET_BITS, false),
new Keyword("get-blue-value" , 8, KW_GET_BLUE, false),
new Keyword("get-browse-column" , 13, KW_GET_BR_C, false), // undocumented abbreviation (missing from keyword index) usage found in customer code
new Keyword("get-buffer-handle" , 0, KW_GET_BUFH, true ),
new Keyword("getbyte" , 0, KW_GET_BYTE, true ),
new Keyword("get-byte" , 0, KW_GET_BYTE, true ),
new Keyword("get-byte-order" , 0, KW_GET_B_OR, false),
new Keyword("get-bytes" , 0, KW_GET_BYTS, false),
new Keyword("get-bytes-available" , 0, KW_GET_B_A , false),
new Keyword("get-callback-proc-context" , 0, KW_GET_CBPC, false), // missing from keyword index and UNTESTED at this time
new Keyword("get-callback-proc-name" , 0, KW_GET_CBPN, false), // missing from keyword index and UNTESTED at this time
new Keyword("get-cc-list" , 0, KW_GET_CC_L, false), // FWD extension, not a real 4GL keyword
new Keyword("get-cell-bgcolor" , 0, KW_G_C_BGCO, false), // FWD extension, not a real 4GL keyword
new Keyword("get-cell-fgcolor" , 0, KW_G_C_FGCO, false), // FWD extension, not a real 4GL keyword
new Keyword("get-cell-string" , 0, KW_GET_C_S , false), // FWD extension, not a real 4GL keyword
new Keyword("get-class" , 0, KW_GETCLASS, false), // missing from keywords, used by a customer
new Keyword("get-column-position" , 0, KW_G_COL_P , false), // FWD extension, not a real 4GL keyword
new Keyword("get-column-width" , 0, KW_G_COL_W , false), // FWD extension, not a real 4GL keyword
new Keyword("getcgi" , 0, KW_GET_CGI , false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("get-cgi" , 0, KW_GET_CGI , false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("get-cgi-list" , 0, KW_GET_CGIL, false),
new Keyword("get-cgi-long" , 0, KW_GET_CGL , false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("get-cgi-long-value" , 0, KW_GET_CGLV, false),
new Keyword("get-cgi-value" , 0, KW_GET_CGIV, false),
new Keyword("get-changes" , 0, KW_GET_CHG , false), // missing from keyword index and UNTESTED at this time
new Keyword("get-child" , 0, KW_GET_CHLD, false),
new Keyword("get-child-relation" , 13, KW_GET_CREL, false), // missing from keyword index, manually tested abbrev and reserved status
new Keyword("get-client" , 0, KW_GET_CLNT, false), // missing from keyword index and UNTESTED at this time
new Keyword("get-codepages" , 12, KW_GET_CODP, false), // missing from keyword index and UNTESTED at this time
new Keyword("get-collation" , 0, KW_GET_CLL , false), // missing from keyword index and UNTESTED at this time
new Keyword("get-collations" , 0, KW_GET_COLL, true ),
new Keyword("getcookie" , 0, KW_GET_COOK, false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("get-cookie" , 0, KW_GET_COOK, false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("get-config" , 0, KW_GET_CFG , false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("get-config-value" , 0, KW_GET_CFGV, false),
new Keyword("get-current" , 0, KW_GET_CUR , false),
new Keyword("get-dataset-buffer" , 0, KW_GET_DS_B, false), // missing from keyword index and UNTESTED at this time
new Keyword("get-db-client" , 0, KW_GET_DBCL, false), // missing from keyword index and UNTESTED at this time
new Keyword("get-dir" , 0, KW_GET_DIR , false), // missing from keyword index and UNTESTED at this time
new Keyword("get-document-element" , 0, KW_GET_D_E , false),
new Keyword("get-double" , 0, KW_GET_DBL , false),
new Keyword("get-dropped-file" , 0, KW_GET_D_F , false),
new Keyword("get-dynamic" , 0, KW_GET_DYN , false),
new Keyword("get-embedded-image-list" , 0, KW_GET_EMBL, false), // FWD extension, not a real 4GL keyword
new Keyword("get-error-column" , 0, KW_GET_ERRC, true ),
new Keyword("get-error-row" , 0, KW_GET_ERRR, true ),
new Keyword("getfield" , 0, KW_GET_FLD , false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("get-field" , 0, KW_GET_FLD , false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("get-file" , 0, KW_GET_FILE, false),
new Keyword("get-file-name" , 0, KW_GET_FNAM, true ),
new Keyword("get-file-offset" , 14, KW_GET_FOFF, true ),
new Keyword("get-first" , 0, KW_GET_1ST , false),
new Keyword("get-first-child-node" , 0, KW_GET_FCN, false), // FWD extension, not a real 4GL keyword
new Keyword("get-float" , 0, KW_GET_FLT , false),
new Keyword("get-green-value" , 9, KW_GET_GRN , false),
new Keyword("get-header-entry" , 0, KW_GET_HD_E, false), // missing from keyword index and UNTESTED at this time
new Keyword("get-index-by-namespace-name" , 0, KW_GET_IBNN, false),
new Keyword("get-index-by-qname" , 0, KW_GET_IBQN, false),
new Keyword("get-int64" , 0, KW_GET_I64 , false),
new Keyword("get-iteration" , 0, KW_GET_ITER, false),
new Keyword("get-key-value" , 11, KW_GET_K_V , true ),
new Keyword("get-last" , 0, KW_GET_LAST, false),
new Keyword("get-license" , 0, KW_GET_LIC , false), // missing in keyword index, found in Possenet code as undocumented built-in function
new Keyword("get-localname-by-index" , 0, KW_GET_LNBI, false),
new Keyword("get-login-parameter" , 0, KW_GET_LPRM, false), // FWD extension, not a real 4GL keyword
new Keyword("get-long" , 0, KW_GET_LONG, false),
new Keyword("get-long-value" , 0, KW_GET_L_V , false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("get-mouse-position" , 0, KW_GET_MOP, false), // FWD extension, not a real 4GL
new Keyword("get-message" , 0, KW_GET_MSG , false),
new Keyword("get-message-groups" , 0, KW_GET_MSGG, false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("get-messages" , 0, KW_GET_MSGS, false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("get-next" , 0, KW_GET_NEXT, false),
new Keyword("get-next-node" , 0, KW_GET_N_N , false), // FWD extension, not a real 4GL keyword
new Keyword("get-next-sibling-node" , 0, KW_GET_NSN , false), // FWD extension, not a real 4GL keyword
new Keyword("get-node" , 0, KW_GET_NODE, false), // missing from keyword index and UNTESTED at this time
new Keyword("get-node-at" , 0, KW_GET_N_AT, false), // FWD extension, not a real 4GL keyword
new Keyword("get-node-bgcolor" , 0, KW_GET_N_BG, false), // FWD extension, not a real 4GL keyword
new Keyword("get-node-fgcolor" , 0, KW_GET_N_FG, false), // FWD extension, not a real 4GL keyword
new Keyword("get-node-has-children" , 0, KW_GET_N_HC, false), // FWD extension, not a real 4GL keyword
new Keyword("get-node-level" , 0, KW_GET_NLEV, false), // FWD extension, not a real 4GL keyword
new Keyword("get-node-text" , 0, KW_GET_NTXT, false), // FWD extension, not a real 4GL keyword
new Keyword("get-node-visible-in-viewport" , 0, KW_GET_NVV , false), // FWD extension, not a real 4GL keyword
new Keyword("get-number" , 0, KW_GET_NUM , false),
new Keyword("get-parent" , 0, KW_GET_PAR , false),
new Keyword("get-parent-node" , 0, KW_GET_PARN, false), // FWD extension, not a real 4GL keyword
new Keyword("get-pointer-value" , 0, KW_GET_PTR , false),
new Keyword("get-prev" , 0, KW_GET_PREV, false),
new Keyword("get-prev-sibling-node" , 0, KW_GET_PSN , false), // FWD extension, not a real 4GL keyword
new Keyword("get-printers" , 0, KW_GET_PRT , false),
new Keyword("get-property" , 0, KW_GET_PROP, false),
new Keyword("get-qname-by-index" , 0, KW_GET_QNBI, false),
new Keyword("get-red-value" , 7, KW_GET_RED , false),
new Keyword("get-relation" , 0, KW_GET_REL , false), // missing from keyword index and UNTESTED at this time
new Keyword("get-repositioned-row" , 0, KW_GET_R_R , false),
new Keyword("get-rgb-value" , 0, KW_GET_RGB , false),
new Keyword("get-sheet-range-columns" , 0, KW_RPT_GSRC, false), // FWD extension, not real 4GL; export Jasper report to csv
new Keyword("get-sheet-range-rows" , 0, KW_RPT_GSRR, false), // FWD extension, not real 4GL; export Jasper report to csv
new Keyword("get-short" , 0, KW_GET_SHRT, false),
new Keyword("get-selected-node-colors" , 0, KW_GET_SNC , false), // FWD extension, not a real 4GL keyword
new Keyword("get-selected-widget" , 12, KW_GET_SELW, false),
new Keyword("get-serialized" , 0, KW_GET_SER , false), // missing from keyword index and UNTESTED at this time
new Keyword("get-signature" , 0, KW_GET_SIG , false),
new Keyword("get-size" , 0, KW_GET_SZ , false),
new Keyword("get-socket-option" , 0, KW_GET_S_O , false),
new Keyword("get-source-buffer" , 0, KW_GET_SRCB, false), // missing from keyword index and UNTESTED at this time
new Keyword("get-string" , 0, KW_GET_STR , false),
new Keyword("get-tab-item" , 0, KW_GET_TI , false),
new Keyword("get-text-height-chars" , 15, KW_GET_THCH, false),
new Keyword("get-text-height-pixels" , 17, KW_GET_THPX, false),
new Keyword("get-text-width-chars" , 14, KW_GET_TWCH, false),
new Keyword("get-text-width-pixels" , 16, KW_GET_TWPX, false),
new Keyword("get-tree-node" , 0, KW_GET_TNOD, false), // FWD extension, not a real 4GL keyword
new Keyword("get-to-list" , 0, KW_GET_TO_L, false), // FWD extension, not a real 4GL keyword
new Keyword("get-top-buffer" , 0, KW_GET_TOPB, false), // missing from keyword index and UNTESTED at this time
new Keyword("get-transaction-state" , 0, KW_GET_T_S , false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("get-type-by-index" , 0, KW_GET_TBI , false),
new Keyword("get-type-by-namespace-name" , 0, KW_GET_TBNN, false),
new Keyword("get-type-by-qname" , 0, KW_GET_TBQN, false),
new Keyword("get-unsigned-short" , 0, KW_GET_USHT, false),
new Keyword("get-unsigned-long" , 0, KW_GET_UL , false),
new Keyword("get-uri-by-index" , 0, KW_GET_UBI , false),
new Keyword("get-user-field" , 0, KW_GET_U_F , false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("get-value" , 0, KW_GET_VAL , false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("get-value-by-index" , 0, KW_GET_VBI , false),
new Keyword("get-value-by-namespace-name" , 0, KW_GET_VBNN, false),
new Keyword("get-value-by-qname" , 0, KW_GET_VBQN, false),
new Keyword("get-wait-state" , 0, KW_GET_WAIT, false),
new Keyword("get-working-directory" , 0, KW_GET_WKDR, false), // FWD extension, not real 4GL!
new Keyword("getsignatureimage" , 0, KW_GET_SIMG, false), // FWD extension, not a real 4GL keyword
new Keyword("global" , 0, KW_GLOBAL , true ),
new Keyword("gt" , 0, KW_GT , false),
new Keyword("go" , 0, KW_GO , false),
new Keyword("go-on" , 0, KW_GO_ON , true ),
new Keyword("go-pending" , 7, KW_GO_PEND , true ),
new Keyword("go-to" , 0, KW_GOTO , false), // missing in keyword index, found in prog handbook as a key function
new Keyword("grant" , 0, KW_GRANT , true ),
new Keyword("graphic-edge" , 9, KW_GRAPHIC , true ),
new Keyword("grid-factor-horizontal" , 13, KW_GRD_F_H , false),
new Keyword("grid-factor-vertical" , 13, KW_GRD_F_V , false),
new Keyword("grid-snap" , 0, KW_GRD_SNAP, false),
new Keyword("grid-unit-height-chars" , 16, KW_GRD_UHC , false),
new Keyword("grid-unit-height-pixels" , 18, KW_GRD_UHP , false),
new Keyword("grid-unit-width-chars" , 15, KW_GRD_UWC , false),
new Keyword("grid-unit-width-pixels" , 17, KW_GRD_UWP , false),
new Keyword("grid-visible" , 0, KW_GRD_VIS , false),
new Keyword("group" , 0, KW_GROUP , true ),
new Keyword("group-box" , 0, KW_GROUP_BX, false), // missing from keyword index and UNTESTED at this time
new Keyword("guid" , 0, KW_GUID , false),
new Keyword("h-scroll-position" , 0, KW_H_SCRL_P, false), // FWD extension, not a real 4GL keyword
new Keyword("handle" , 0, KW_HANDLE , false),
new Keyword("handler" , 0, KW_HANDLER , false),
new Keyword("has-lobs" , 0, KW_HAS_LOBS, false), // missing from keyword index and UNTESTED at this time
new Keyword("has-records" , 0, KW_HAS_REC , false),
new Keyword("hash-code" , 0, KW_HASHCODE, true ),
new Keyword("having" , 0, KW_HAVING , true ),
new Keyword("header" , 0, KW_HEADER , true ),
new Keyword("height-chars" , 6, KW_HEIGHT_C, false),
new Keyword("height-pixels" , 8, KW_HEIGHT_P, false),
new Keyword("help" , 0, KW_HELP , true ),
new Keyword("help-topic" , 0, KW_HELP_TOP, false),
new Keyword("hex-decode" , 0, KW_HEX_DECD, false),
new Keyword("hex-encode" , 0, KW_HEX_ENCD, false),
new Keyword("hide" , 0, KW_HIDE , true ),
new Keyword("hidden-field" , 0, KW_HID_FLD , false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("hidden-field-list" , 0, KW_HID_FLDL, false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("hidden" , 0, KW_HIDDEN , false),
new Keyword("hint" , 0, KW_HINT , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("hit-test" , 0, KW_HIT_TEST, false), // FWD extension, not a real 4GL keyword
new Keyword("hit-test-fwd" , 0, KW_HIT_TFWD, false), // FWD extension, not a real 4GL keyword
new Keyword("home" , 0, KW_HOME , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("horizontal" , 4, KW_HORIZ , false),
new Keyword("host-byte-order" , 0, KW_HOST_B_O, true ),
new Keyword("html-browser" , 0, KW_HTML_BWS, false), // FWD extension, not a real 4GL keyword
new Keyword("html-charset" , 0, KW_HTML_CHS, false),
new Keyword("html-encode" , 0, KW_HTML_ENC, false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("html-end-of-line" , 0, KW_HTML_EOL, false),
new Keyword("html-end-of-page" , 0, KW_HTML_EOP, false),
new Keyword("html-frame-begin" , 0, KW_HTML_FRB, false),
new Keyword("html-frame-end" , 0, KW_HTML_FRE, false),
new Keyword("html-header-begin" , 0, KW_HTML_H_B, false),
new Keyword("html-header-end" , 0, KW_HTML_H_E, false),
new Keyword("html-title-begin" , 0, KW_HTML_T_B, false),
new Keyword("html-title-end" , 0, KW_HTML_T_E, false),
new Keyword("htmlerror" , 0, KW_HTMLERR , false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("hwnd" , 0, KW_HWND , false),
new Keyword("hyperlink" , 0, KW_HYPERLNK, false), // FWD extension, not a real 4GL keyword
new Keyword("honorprokeys" , 0, KW_HONOR_PK, false), // missing in keyword index, found elsewhere in lang ref
new Keyword("honorreturnkey" , 0, KW_HONOR_RK, false), // missing in keyword index, found elsewhere in lang ref
new Keyword("icon" , 0, KW_ICON , false),
new Keyword("ide-parent-hwnd" , 0, KW_IDEPHWND, false),
new Keyword("ide-window-type" , 0, KW_IDEWNTYP, false),
new Keyword("ignore-current-modified" , 0, KW_IGN_CMOD, false), // missing from keyword index and UNTESTED at this time
new Keyword("if" , 0, KW_IF , true ),
new Keyword("icfparameter" , 8, KW_ICFPARM , false), // undocumented feature: can be abbreviated
new Keyword("image" , 0, KW_IMAGE , false),
new Keyword("image-down" , 0, KW_IMG_DOWN, false),
new Keyword("image-insensitive" , 0, KW_IMG_INS , false),
new Keyword("image-list" , 0, KW_IMG_LIST, false), // FWD extension, not a real 4GL keyword
new Keyword("image-only" , 0, KW_IMG_ONLY, false), // FWD extension, not a real 4GL keyword
new Keyword("imagelist" , 0, KW_IL_IMG , false), // FWD extension, not a real 4GL keyword
new Keyword("il-back-color" , 0, KW_IL_BGCOL, false), // FWD extension, not a real 4GL keyword
new Keyword("il-image-height" , 0, KW_IL_HEIGH, false), // FWD extension, not a real 4GL keyword
new Keyword("il-image-width" , 0, KW_IL_WIDTH, false), // FWD extension, not a real 4GL keyword
new Keyword("il-list-images" , 0, KW_IL_LIST , false), // FWD extension, not a real 4GL keyword
new Keyword("il-mask-color" , 0, KW_IL_MASK , false), // FWD extension, not a real 4GL keyword
new Keyword("il-overlay" , 0, KW_IL_OVER , false), // FWD extension, not a real 4GL keyword
new Keyword("il-use-mask-color" , 0, KW_IL_UMASK, false), // FWD extension, not a real 4GL keyword
new Keyword("image-size" , 0, KW_IMG_SZ , false),
new Keyword("image-size-chars" , 12, KW_IMG_SZ_C, false),
new Keyword("image-size-pixels" , 12, KW_IMG_SZ_P, false),
new Keyword("image-up" , 0, KW_IMG_UP , false),
new Keyword("immediate-display" , 0, KW_IMM_DISP, false),
new Keyword("implements" , 0, KW_IMPLEMTS, false),
new Keyword("import" , 0, KW_IMPORT , true ),
new Keyword("import-principal" , 0, KW_IMP_PRNC, false),
new Keyword("import-node" , 0, KW_IMP_NODE, false),
new Keyword("in" , 0, KW_IN , true ),
new Keyword("in-handle" , 0, KW_IN_HNDL , false),
new Keyword("increment-exclusive-id" , 0, KW_INC_EX_I, false),
new Keyword("indentation" , 0, KW_INDENT , false ), // FWD extension, not a real 4GL keyword
new Keyword("index" , 0, KW_INDEX , true ),
new Keyword("index-hint" , 0, KW_IDX_HINT, false),
new Keyword("index-information" , 0, KW_IDX_INFO, false),
new Keyword("indexed-reposition" , 0, KW_IDX_REPO, false),
new Keyword("indicator" , 0, KW_INDICAT , true ),
new Keyword("information" , 4, KW_INFO , false),
new Keyword("inherits" , 0, KW_INHERITS, false),
new Keyword("inherit-bgcolor" , 0, KW_INH_BGC , false), // missing from keyword index and UNTESTED at this time
new Keyword("inherit-fgcolor" , 0, KW_INH_FGC , false), // missing from keyword index and UNTESTED at this time
new Keyword("init-session" , 0, KW_INIT_SES, false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("initial" , 4, KW_INIT , false),
new Keyword("initial-dir" , 0, KW_INIT_DIR, false),
new Keyword("initial-filter" , 0, KW_INIT_FLT, false),
new Keyword("initialize" , 0, KW_INIT_C_P, false), // CLIENT-PRINCIPAL:INITALIZE method
new Keyword("initialize-document-type" , 0, KW_INIT_D_T, false),
new Keyword("initiate" , 0, KW_INITIATE, false),
new Keyword("inner-chars" , 0, KW_INNER_C , false),
new Keyword("inner-lines" , 0, KW_INNER_L , false),
new Keyword("inner" , 0, KW_INNER , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("input" , 0, KW_INPUT , true ),
new Keyword("input-output" , 7, KW_IN_OUT , true ),
new Keyword("input-value" , 0, KW_INPT_VAL, false),
new Keyword("insert" , 0, KW_INSERT , true ),
new Keyword("insert-attribute" , 0, KW_INS_ATTR, false),
new Keyword("insert-backtab" , 8, KW_INS_BTAB, false),
new Keyword("insert-before" , 0, KW_INS_B4 , false),
new Keyword("insert-column" , 0, KW_INS_COL , false), // missing in keyword index, found in prog handbook as a key function
new Keyword("insert-file" , 0, KW_INS_FILE, false),
new Keyword("insert-field" , 0, KW_INS_FLD , false), // missing in keyword index, found in prog handbook as a key function
new Keyword("insert-field-data" , 0, KW_INS_FLDD, false), // missing in keyword index, found in prog handbook as a key function
new Keyword("insert-field-label" , 0, KW_INS_FLDL, false), // missing in keyword index, found in prog handbook as a key function
new Keyword("insert-mode" , 0, KW_INS_MODE, false), // missing in keyword index, found elsewhere in lang ref
new Keyword("insert-row" , 0, KW_INS_ROW , false),
new Keyword("insert-string" , 0, KW_INS_STR , false),
new Keyword("insert-tab" , 8, KW_INS_TAB , false),
new Keyword("instantiating-procedure" , 0, KW_INST_PRC, false), // missing from keyword index and UNTESTED at this time
new Keyword("int64" , 0, KW_INT64 , false),
new Keyword("integer" , 3, KW_INT , false),
new Keyword("interface" , 0, KW_INTERFAC, false),
new Keyword("internal-entries" , 0, KW_INT_ENT , false),
new Keyword("interval" , 0, KW_INTERVAL, false), // missing from keyword index and UNTESTED at this time
new Keyword("into" , 0, KW_INTO , true ),
new Keyword("invoke" , 0, KW_INVOKE , false),
new Keyword("ip-capture-time" , 0, KW_IP_TIME , false), // FWD extension, not a real 4GL keyword
new Keyword("is" , 0, KW_IS , true ),
new Keyword("is-db-multi-tenant" , 0, KW_IS_DB_MT, false), // latest language reference includes this
new Keyword("is-attr-space" , 7, KW_IS_ATTR , true ),
new Keyword("is-class" , 7, KW_IS_CLASS, false),
new Keyword("is-codepage-fixed" , 0, KW_IS_CP_FX, false), // missing from keyword index and UNTESTED at this time
new Keyword("is-column-codepage" , 0, KW_IS_COLCP, false), // missing from keyword index and UNTESTED at this time
new Keyword("is-column-visible" , 0, KW_IS_C_VIS, false), // FWD extension, not a real 4GL keyword
new Keyword("is-json" , 0, KW_IS_JSON, false),
new Keyword("is-lead-byte" , 0, KW_IS_LEAD , true ),
new Keyword("is-multi-select" , 0, KW_IS_MSEL, false), // FWD extension, not a real 4GL keyword
new Keyword("is-multi-tenant" , 0, KW_IS_M_TEN, false), // missing in keyword index, found in customer code
new Keyword("is-node-expanded" , 0, KW_IS_N_EXP, false), // FWD extension, not a real 4GL keyword
new Keyword("is-open" , 0, KW_IS_OPEN , false),
new Keyword("is-parameter-set" , 0, KW_IS_P_SET, false),
new Keyword("is-partitioned" , 13, KW_IS_PART , false),
new Keyword("is-row-selected" , 0, KW_IS_R_SEL, false),
new Keyword("is-selected" , 0, KW_IS_SEL , false),
new Keyword("is-xml" , 0, KW_IS_XML , false), // missing from keyword index, found elsewhere in lang ref
new Keyword("iso-date" , 0, KW_ISO_DATE, false), // missing from keyword index and UNTESTED at this time
new Keyword("item" , 0, KW_ITEM , false),
new Keyword("items-per-row" , 0, KW_ITEM_ROW, false),
new Keyword("iteration-changed" , 0, KW_ITER_CHG, false), // missing in keyword index, found elsewhere in lang ref
new Keyword("iunknown" , 0, KW_IUNKNOWN, false), // missing in keyword index, found elsewhere in external program interface ref
new Keyword("java" , 0, KW_JAVA , false), // FWD extension, not a real 4GL keyword
new Keyword("join" , 0, KW_JOIN , true ),
new Keyword("join-by-sqldb" , 0, KW_JOIN_BY , false),
new Keyword("kblabel" , 0, KW_KBLABEL , true ),
new Keyword("keep-connection-open" , 0, KW_KEEP_CON, false),
new Keyword("keep-frame-z-order" , 12, KW_KEEP_ZOR, false),
new Keyword("keep-messages" , 0, KW_KEEP_MSG, false),
new Keyword("keep-security-cache" , 0, KW_KEEP_SEC, false),
new Keyword("keep-tab-order" , 0, KW_KEEP_TAB, false),
new Keyword("keycode" , 0, KW_KEYCODE , true ),
new Keyword("key-code" , 0, KW_KEYCODE , true ),
new Keyword("keyfunction" , 7, KW_KEYFUNC , true ),
new Keyword("key-function" , 8, KW_KEYFUNC , true ),
new Keyword("keylabel" , 0, KW_KEYLAB , true ),
new Keyword("key-label" , 0, KW_KEYLAB , true ),
new Keyword("key" , 0, KW_KEY , false),
new Keyword("keypadaddhotspot" , 0, KW_KPAD_HOT, false), // FWD extension, not a real 4GL keyword
new Keyword("keypadclearhotspotlist" , 0, KW_KPAD_CLE, false), // FWD extension, not a real 4GL keyword
new Keyword("keypadqueryhotspot" , 0, KW_KPAD_QRY, false), // FWD extension, not a real 4GL keyword
new Keyword("keys" , 0, KW_KEYS , true ),
new Keyword("keyword" , 0, KW_KW , true ),
new Keyword("keyword-all" , 0, KW_KW_ALL , false),
new Keyword("label" , 0, KW_LABEL , true ),
new Keyword("label-bgcolor" , 9, KW_LAB_BGC , false),
new Keyword("label-dcolor" , 8, KW_LAB_DC , false),
new Keyword("label-fgcolor" , 9, KW_LAB_FGC , false),
new Keyword("label-font" , 0, KW_LAB_FONT, false),
new Keyword("label-pfcolor" , 9, KW_LAB_PFC , false),
new Keyword("labels" , 0, KW_LABELS , false),
new Keyword("labels-have-colons" , 0, KW_LAB_H_C , false),
new Keyword("landscape" , 0, KW_LANDSCAP, false),
new Keyword("languages" , 8, KW_LANGUAGE, false),
new Keyword("large" , 0, KW_LARGE , false),
new Keyword("large-to-small" , 0, KW_LG_2_SM , false),
new Keyword("last" , 0, KW_LAST , true ),
new Keyword("last-batch" , 0, KW_LAST_BAT, false),
new Keyword("last-form" , 0, KW_LAST_FRM, false),
new Keyword("last-object" , 0, KW_LAST_OBJ, false),
new Keyword("last-of" , 0, KW_LAST_OF , true ),
new Keyword("lastkey" , 0, KW_LASTKEY , true ),
new Keyword("last-key" , 0, KW_LASTKEY , true ),
new Keyword("last-async-request" , 0, KW_LAST_AR , false),
new Keyword("last-child" , 0, KW_LAST_CH , false),
new Keyword("last-event" , 9, KW_LAST_EVT, true ),
new Keyword("last-procedure" , 10, KW_LAST_PRC, false),
new Keyword("last-server" , 0, KW_LAST_SRV, false),
new Keyword("last-server-socket" , 0, KW_LAST_SS , false),
new Keyword("last-socket" , 0, KW_LAST_SOC, false),
new Keyword("last-tab-item" , 10, KW_LAST_TI , false),
new Keyword("ldbname" , 0, KW_LDBNAME , true ),
new Keyword("lower" , 0, KW_LC , false), // missing in keyword index, found elsewhere in SQL reference
new Keyword("lc" , 0, KW_LC , false),
new Keyword("lcdrefresh" , 0, KW_LCD_REFR, false), // FWD extension, not a real 4GL keyword
new Keyword("lcdsetwindow" , 0, KW_LCD_SWIN, false), // FWD extension, not a real 4GL keyword
new Keyword("lcdwritestring" , 0, KW_LCD_WSTR, false), // FWD extension, not a real 4GL keyword
new Keyword("le" , 0, KW_LTE , false),
new Keyword("leave" , 0, KW_LEAVE , true ),
new Keyword("left" , 0, KW_LEFT , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("left-aligned" , 10, KW_LEFT_AL , false),
new Keyword("left-end" , 0, KW_LEFT_END, false), // missing in keyword index, found elsewhere in lang ref
new Keyword("left-mouse-click" , 0, KW_LEFT_MC , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("left-mouse-dblclick" , 0, KW_LEFT_MDC, false), // missing in keyword index, found elsewhere in lang ref
new Keyword("left-mouse-down" , 0, KW_LEFT_MD , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("left-mouse-up" , 0, KW_LEFT_MU , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("left-trim" , 0, KW_L_TRIM , false),
new Keyword("length" , 0, KW_LENGTH , false),
new Keyword("library" , 0, KW_LIB , true ),
new Keyword("library-calling-convention" , 0, KW_LIB_C_C , false),
new Keyword("like" , 0, KW_LIKE , true ),
new Keyword("like-sequential" , 0, KW_LIKE_SEQ, true ),
new Keyword("line" , 0, KW_LINE , false),
new Keyword("line-counter" , 10, KW_LINE_CNT, true ),
new Keyword("list-events" , 0, KW_LST_EVNT, false),
new Keyword("listing" , 5, KW_LISTING , true ),
new Keyword("listings" , 0, KW_LISTINGS, false), // missing from keyword index, found in customer code and UNTESTED at this time
new Keyword("list-item-pairs" , 0, KW_LST_PAIR, false),
new Keyword("list-items" , 0, KW_LIST_ITM, false),
new Keyword("list-property-names" , 0, KW_LIST_PNM, false),
new Keyword("list-query-attrs" , 0, KW_LST_QRY , false),
new Keyword("list-set-attrs" , 0, KW_LST_SET , false),
new Keyword("list-widgets" , 0, KW_LST_WID , false),
new Keyword("literal-question" , 0, KW_LIT_QSTN, false),
new Keyword("little-endian" , 0, KW_L_ENDIAN, true ),
new Keyword("lt" , 0, KW_LT , false),
new Keyword("load" , 0, KW_LOAD , false),
new Keyword("loadcontrols" , 0, KW_LOADCTRL, false), // missing in keyword index, found elsewhere in lang ref
new Keyword("load-domains" , 0, KW_LOAD_DMN, false),
new Keyword("load-icon" , 0, KW_LOAD_ICO, false),
new Keyword("load-image" , 0, KW_LOAD_IMG, false),
new Keyword("load-image-down" , 0, KW_LOAD_I_D, false),
new Keyword("load-image-insensitive" , 0, KW_LOAD_I_I, false),
new Keyword("load-image-up" , 0, KW_LOAD_I_U, false),
new Keyword("load-mouse-pointer" , 12, KW_LOAD_M_P, false),
new Keyword("load-picture" , 0, KW_LOAD_PIC, false),
new Keyword("load-small-icon" , 0, KW_LOAD_S_I, false),
new Keyword("lob-dir" , 0, KW_LOB_DIR , false), // missing from keyword index and UNTESTED at this time
new Keyword("local-host" , 0, KW_LOC_HOST, false),
new Keyword("local-name" , 0, KW_LOC_NAME, false),
new Keyword("local-port" , 0, KW_LOC_PORT, false),
new Keyword("local-version-info" , 0, KW_LOC_V_I , false),
new Keyword("locator-column-number" , 0, KW_LOC_C_N , false),
new Keyword("locator-line-number" , 0, KW_LOC_L_N , false),
new Keyword("locator-public-id" , 0, KW_LOC_P_ID, false),
new Keyword("locator-system-id" , 0, KW_LOC_S_ID, false),
new Keyword("locator-type" , 0, KW_LOC_TYPE, false),
new Keyword("locked" , 0, KW_LOCKED , true ),
new Keyword("lock-registration" , 0, KW_LOCK_REG, false),
new Keyword("log" , 0, KW_LOG , false),
new Keyword("log-audit-event" , 0, KW_LOG_A_EV, false),
new Keyword("log-entry-types" , 0, KW_LOG_EN_T, false), // missing from keyword index and UNTESTED at this time
new Keyword("log-id" , 0, KW_LOG_ID , false), // missing from keyword index and found in customer code
new Keyword("log-manager" , 0, KW_LOG_MGR , true ),
new Keyword("log-threshold" , 0, KW_LOG_THRS, false), // missing from keyword index and UNTESTED at this time
new Keyword("logfile-name" , 0, KW_LOGF_NAM, false), // missing from keyword index and UNTESTED at this time
new Keyword("logging-level" , 0, KW_LOGG_LEV, false), // missing from keyword index and UNTESTED at this time
new Keyword("logical" , 4, KW_LOGICAL , false),
new Keyword("login-expiration-timestamp" , 0, KW_LOG_E_TS, false),
new Keyword("login-host" , 0, KW_LOG_HOST, false),
new Keyword("login-state" , 0, KW_LOG_STAT, false),
new Keyword("logout" , 0, KW_LOGOUT , false),
new Keyword("lookahead" , 0, KW_LOOKAHD , false),
new Keyword("lookup" , 0, KW_LOOKUP , true ),
new Keyword("long" , 0, KW_LONG , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("longchar" , 0, KW_LONGCHAR, false), // missing from keyword index and UNTESTED at this time
new Keyword("longchar-to-node-value" , 0, KW_LCHR_2NV, false), // missing from keyword index and UNTESTED at this time
new Keyword("machine-class" , 0, KW_MACH_CLS, true ),
new Keyword("main-menu" , 0, KW_MAINMENU, false), // missing in keyword index, found in prog handbook as a key function
new Keyword("mandatory" , 0, KW_MAND , false),
new Keyword("manual-highlight" , 0, KW_MAN_HIGH, false),
new Keyword("margin-extra" , 0, KW_MARG_EX , false), // found in keyword index, this is an undocumented DEFINE BUTTON option
new Keyword("margin-height-chars" , 13, KW_MARG_H_C, false),
new Keyword("margin-height-pixels" , 15, KW_MARG_H_P, false),
new Keyword("margin-width-chars" , 12, KW_MARG_W_C, false),
new Keyword("margin-width-pixels" , 14, KW_MARG_W_P, false),
new Keyword("mark-new" , 0, KW_MARK_NEW, false),
new Keyword("mark-row-state" , 0, KW_MARK_RS , false),
new Keyword("maximum" , 3, KW_MAX , false), // handles "separate keyword" max too
new Keyword("maximize" , 0, KW_MAXIMIZE, false),
new Keyword("max-button" , 0, KW_MAX_BTN , false),
new Keyword("max-chars" , 0, KW_MAX_CHAR, false),
new Keyword("max-data-guess" , 0, KW_MAX_D_G , false),
new Keyword("max-height" , 0, KW_MAX_HT , false),
new Keyword("max-height-chars" , 12, KW_MAX_H_C , false),
new Keyword("max-height-pixels" , 12, KW_MAX_H_P , false),
new Keyword("maximum-level" , 0, KW_MAX_LVL , false),
new Keyword("max-width-chars" , 9, KW_MAX_W_C , false),
new Keyword("max-width-pixels" , 11, KW_MAX_W_P , false),
new Keyword("max-rows" , 0, KW_MAX_ROWS, false),
new Keyword("max-size" , 0, KW_MAX_SZ , false),
new Keyword("max-value" , 7, KW_MAX_VAL , false),
new Keyword("max-width" , 0, KW_MAX_WID , false),
new Keyword("map" , 0, KW_MAP , true ),
new Keyword("matches" , 0, KW_MATCHES , false),
new Keyword("md5-value" , 0, KW_MD5_VAL , false), // missing from keyword index and UNTESTED at this time
new Keyword("md5-digest" , 0, KW_MD5_DIG , false),
new Keyword("member" , 0, KW_MEMBER , true ),
new Keyword("memptr" , 3, KW_MEMPTR , false),
new Keyword("memptr-to-node-value" , 0, KW_MPTR_2NV, false),
new Keyword("menu" , 0, KW_MENU , false),
new Keyword("menu-bar" , 0, KW_MENU_BAR, false),
new Keyword("menu-drop" , 0, KW_MENU_DRP, false), // missing in keyword index, found elsewhere in lang ref
new Keyword("menu-key" , 6, KW_MENU_KEY, false),
new Keyword("menu-mouse" , 6, KW_MENU_MOU, false),
new Keyword("menubar" , 0, KW_MENU_BAR, false),
new Keyword("menu-item" , 0, KW_MENU_ITM, false),
new Keyword("merge-by-field" , 0, KW_MERGE_BF, false),
new Keyword("merge-changes" , 0, KW_MERGE_CH, false), // missing from keyword index and UNTESTED at this time
new Keyword("merge-row-changes" , 0, KW_MERGE_RC, false), // missing from keyword index and UNTESTED at this time
new Keyword("message" , 0, KW_MSG , true ),
new Keyword("messages" , 0, KW_MESSAGES, false),
new Keyword("message-area" , 0, KW_MSG_AREA, false),
new Keyword("message-area-font" , 0, KW_MSG_AFNT, false),
new Keyword("message-area-msg" , 0, KW_MSG_AMSG, false), // missing from keyword index, undocumented SESSION method found in customer application
new Keyword("message-digest" , 0, KW_MSG_DIG , false), // missing from keyword index and UNTESTED at this time
new Keyword("message-lines" , 0, KW_MSG_LINE, true ),
new Keyword("method" , 0, KW_METHOD , false),
new Keyword("mf-draw-filled-rect" , 0, KW_MF_DFR , false), // FWD extension, not real 4GL!
new Keyword("mf-draw-image" , 0, KW_MF_DI , false), // FWD extension, not real 4GL!
new Keyword("mf-draw-image-part" , 0, KW_MF_DIP , false), // FWD extension, not real 4GL!
new Keyword("mf-draw-line" , 0, KW_MF_DL , false), // FWD extension, not real 4GL!
new Keyword("mf-draw-rect" , 0, KW_MF_DR , false), // FWD extension, not real 4GL!
new Keyword("mf-draw-text" , 0, KW_MF_DT , false), // FWD extension, not real 4GL!
new Keyword("mf-draw-text-and-set-x" , 0, KW_MF_DTSX , false), // FWD extension, not real 4GL!
new Keyword("mf-draw-text-at-x" , 0, KW_MF_DTAX , false), // FWD extension, not real 4GL!
new Keyword("mf-draw-text-at-x-left" , 0, KW_MF_DTAXL, false), // FWD extension, not real 4GL!
new Keyword("mf-draw-text-at-x-right" , 0, KW_MF_DTAXR, false), // FWD extension, not real 4GL!
new Keyword("mf-draw-text-between" , 0, KW_MF_DTB , false), // FWD extension, not real 4GL!
new Keyword("mf-draw-text-between-left" , 0, KW_MF_DTBL , false), // FWD extension, not real 4GL!
new Keyword("mf-draw-text-between-right" , 0, KW_MF_DTBR , false), // FWD extension, not real 4GL!
new Keyword("mf-get-font" , 0, KW_MF_GF , false), // FWD extension, not real 4GL!
new Keyword("mf-get-font-height" , 0, KW_MF_GFH , false), // FWD extension, not real 4GL!
new Keyword("mf-get-free-space-down" , 0, KW_MF_GFSD , false), // FWD extension, not real 4GL!
new Keyword("mf-get-free-space-right" , 0, KW_MF_GFSR , false), // FWD extension, not real 4GL!
new Keyword("mf-get-page-height" , 0, KW_MF_GPH , false), // FWD extension, not real 4GL!
new Keyword("mf-get-page-number" , 0, KW_MF_GPN , false), // FWD extension, not real 4GL!
new Keyword("mf-get-page-width" , 0, KW_MF_GPW , false), // FWD extension, not real 4GL!
new Keyword("mf-get-text-width" , 0, KW_MF_GTW , false), // FWD extension, not real 4GL!
new Keyword("mf-get-xy" , 0, KW_MF_GXY , false), // FWD extension, not real 4GL!
new Keyword("mf-get-zoom-factor" , 0, KW_MF_GZF , false), // FWD extension, not real 4GL!
new Keyword("mf-init" , 0, KW_MF_INIT , false), // FWD extension, not real 4GL!
new Keyword("mf-interrupt-recording" , 0, KW_MF_IR , false), // FWD extension, not real 4GL!
new Keyword("mf-make-pdf" , 0, KW_MF_MPDF , false), // FWD extension, not real 4GL!
new Keyword("mf-pixels-to-metafile-units" , 0, KW_MF_P2MU , false), // FWD extension, not real 4GL!
new Keyword("mf-reset-page" , 0, KW_MF_RP , false), // FWD extension, not real 4GL!
new Keyword("mf-set-fill-color" , 0, KW_MF_SFC , false), // FWD extension, not real 4GL!
new Keyword("mf-set-font" , 0, KW_MF_SF , false), // FWD extension, not real 4GL!
new Keyword("mf-set-font-height" , 0, KW_MF_SFH , false), // FWD extension, not real 4GL!
new Keyword("mf-set-image-align" , 0, KW_MF_SIA , false), // FWD extension, not real 4GL!
new Keyword("mf-set-interleaving" , 0, KW_MF_SI , false), // FWD extension, not real 4GL!
new Keyword("mf-set-left-margin" , 0, KW_MF_SLM , false), // FWD extension, not real 4GL!
new Keyword("mf-set-line-attributes" , 0, KW_MF_SLA , false), // FWD extension, not real 4GL!
new Keyword("mf-set-line-color" , 0, KW_MF_SLC , false), // FWD extension, not real 4GL!
new Keyword("mf-set-line-style" , 0, KW_MF_SLS , false), // FWD extension, not real 4GL!
new Keyword("mf-set-page-number" , 0, KW_MF_SPN , false), // FWD extension, not real 4GL!
new Keyword("mf-set-page-number-position" , 0, KW_MF_SPNP , false), // FWD extension, not real 4GL!
new Keyword("mf-set-page-number-text" , 0, KW_MF_SPNT , false), // FWD extension, not real 4GL!
new Keyword("mf-set-page-orientation" , 0, KW_MF_SPO , false), // FWD extension, not real 4GL!
new Keyword("mf-set-text-align" , 0, KW_MF_STA , false), // FWD extension, not real 4GL!
new Keyword("mf-set-text-color" , 0, KW_MF_STC , false), // FWD extension, not real 4GL!
new Keyword("mf-set-text-style" , 0, KW_MF_STS , false), // FWD extension, not real 4GL!
new Keyword("mf-set-xy" , 0, KW_MF_SXY , false), // FWD extension, not real 4GL!
new Keyword("mf-set-zoom-factor" , 0, KW_MF_SZF , false), // FWD extension, not real 4GL!
new Keyword("mf-show-page-footer" , 0, KW_MF_SPF , false), // FWD extension, not real 4GL!
new Keyword("mf-start-new-page" , 0, KW_MF_SNP , false), // FWD extension, not real 4GL!
new Keyword("mf-start-new-text-line" , 0, KW_MF_SNTL , false), // FWD extension, not real 4GL!
new Keyword("mf-stop-recording" , 0, KW_MF_SR , false), // FWD extension, not real 4GL!
new Keyword("middle-mouse-click" , 0, KW_MDL_MC , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("middle-mouse-dblclick" , 0, KW_MDL_MDC , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("middle-mouse-down" , 0, KW_MDL_MD , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("middle-mouse-up" , 0, KW_MDL_MU , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("minimum" , 3, KW_MIN , false), // handles "separate keyword" min too
new Keyword("min-button" , 0, KW_MIN_BTN , false),
new Keyword("min-column-width-chars" , 0, KW_MIN_CWCH, false), // missing from keyword index and UNTESTED at this time
new Keyword("min-column-width-pixels" , 0, KW_MIN_CWPX, false), // missing from keyword index and UNTESTED at this time
new Keyword("min-height-chars" , 10, KW_MIN_H_C , false),
new Keyword("min-height-pixels" , 12, KW_MIN_H_P , false),
new Keyword("min-schema-marshal" , 0, KW_MIN_SCHM, false), // missing from keyword index and UNTESTED at this time
new Keyword("min-width-chars" , 9, KW_MIN_W_C , false),
new Keyword("min-width-pixels" , 11, KW_MIN_W_P , false),
new Keyword("min-size" , 0, KW_MIN_SZ , false),
new Keyword("min-value" , 7, KW_MIN_VAL , false),
new Keyword("mnemonic" , 0, KW_MNEMON , false), // FWD extension, not real 4GL!
new Keyword("modulo" , 3, KW_MOD , false),
new Keyword("modified" , 0, KW_MODIFIED, false),
new Keyword("modifiers" , 0, KW_MODIFIRS, false), // FWD extension, not a real 4GL keyword
new Keyword("month" , 0, KW_MONTH , false),
new Keyword("mouse" , 0, KW_MOUSE , true ),
new Keyword("mouse-extend-click" , 0, KW_MOU_XC , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("mouse-extend-dblclick" , 0, KW_MOU_XDC , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("mouse-extend-down" , 0, KW_MOU_XD , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("mouse-extend-up" , 0, KW_MOU_XU , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("mouse-menu-click" , 0, KW_MOU_MC , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("mouse-menu-dblclick" , 0, KW_MOU_MDC , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("mouse-menu-down" , 0, KW_MOU_MD , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("mouse-menu-up" , 0, KW_MOU_MU , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("mouse-move-click" , 0, KW_MOU_MVC , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("mouse-move-dblclick" , 0, KW_MOU_MVDC, false), // missing in keyword index, found elsewhere in lang ref
new Keyword("mouse-move-down" , 0, KW_MOU_MVD , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("mouse-move-up" , 0, KW_MOU_MVU , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("mouse-pointer" , 7, KW_MOU_PTR , false),
new Keyword("mouse-select-click" , 0, KW_MOU_SC , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("mouse-select-dblclick" , 0, KW_MOU_SDC , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("mouse-select-down" , 0, KW_MOU_SD , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("mouse-select-up" , 0, KW_MOU_SU , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("mouse-click" , 0, KW_MS_CLICK, false), // FWD extension, not a real 4GL keyword
new Keyword("mouse-dblclick" , 0, KW_MS_DBCLK, false), // FWD extension, not a real 4GL keyword
new Keyword("mouse-down" , 0, KW_MS_DOWN , false), // FWD extension, not a real 4GL keyword
new Keyword("mouse-move" , 0, KW_MS_MOVE , false), // FWD extension, not a real 4GL keyword
new Keyword("mouse-up" , 0, KW_MS_UP , false), // FWD extension, not a real 4GL keyword
new Keyword("movable" , 0, KW_MOVABLE , false),
new Keyword("move" , 0, KW_MOVE , false), // missing in keyword index, found in prog handbook as a key function
new Keyword("move-after-tab-item" , 10, KW_MOV_A_T , false),
new Keyword("move-before-tab-item" , 10, KW_MOV_B_T , false),
new Keyword("move-column" , 8, KW_MOV_COL , false),
new Keyword("move-down-in-parent" , 0, KW_M_D_I_P , false), // FWD extension, not a real 4GL keyword
new Keyword("move-up-in-parent" , 0, KW_M_U_I_P , false), // FWD extension, not a real 4GL keyword
new Keyword("move-to-bottom" , 9, KW_MOV_2_B , false),
new Keyword("move-to-eof" , 0, KW_MOV_2EOF, false),
new Keyword("move-to-top" , 9, KW_MOV_2_T , false),
new Keyword("mpe" , 0, KW_MPE , true ),
new Keyword("mtime" , 0, KW_MTIME , false), // missing from keyword index and UNTESTED at this time
new Keyword("multi-compile" , 0, KW_MULT_CMP, false),
new Keyword("multi-line" , 0, KW_TAB_ML, false), // FWD extension, not a real 4GL keyword
new Keyword("multiple" , 0, KW_MULTIPLE, false),
new Keyword("multiple-key" , 0, KW_MULT_KEY, false),
new Keyword("multitasking-interval" , 0, KW_MULTI_IN, false),
new Keyword("must-exist" , 0, KW_MUST_EXI, false),
new Keyword("must-understand" , 0, KW_MUST_UND, false), // missing from keyword index and UNTESTED at this time
new Keyword("name" , 0, KW_NAME , false),
new Keyword("namespace-prefix" , 0, KW_NAMESP_P, false),
new Keyword("namespace-uri" , 0, KW_NAMESP_U, false),
new Keyword("native" , 0, KW_NATIVE , false),
new Keyword("ne" , 0, KW_NE , false),
new Keyword("needs-appserver-prompt" , 0, KW_NEEDS_AP, false),
new Keyword("needs-prompt" , 0, KW_NEEDS_PR, false),
new Keyword("nested" , 0, KW_NESTED , false), // missing from keyword index and UNTESTED at this time
new Keyword("new" , 0, KW_NEW , true ),
new Keyword("new-instance" , 0, KW_NEW_INST, false),
new Keyword("new-label" , 0, KW_NEW_LBL, false), // FWD extension, not a real 4GL keyword
new Keyword("new-line" , 0, KW_NEW_LINE, false), // missing in keyword index, found in customer source code
new Keyword("new-row" , 0, KW_NEW_ROW , false),
new Keyword("new-session" , 0, KW_NEW_SESS, false), // FWD extension, not a real 4GL keyword
new Keyword("next" , 0, KW_NEXT , true ),
new Keyword("next-column" , 0, KW_NEXT_COL, false),
new Keyword("next-error" , 0, KW_NEXT_ERR, false), // missing in keyword index, found in prog handbook as a key function
new Keyword("next-frame" , 0, KW_NEXT_FR , false),
new Keyword("next-prompt" , 0, KW_NEXT_PMT, true ),
new Keyword("next-rowid" , 0, KW_NEXT_RID, false),
new Keyword("next-sibling" , 0, KW_NEXT_SIB, false),
new Keyword("next-tab-item" , 10, KW_NEXT_TAB, false),
new Keyword("next-value" , 0, KW_NEXT_VAL, false),
new Keyword("next-word" , 0, KW_NEXTWORD, false), // missing in keyword index, found in prog handbook as a key function
new Keyword("no" , 0, BOOL_FALSE , true ),
new Keyword("no-apply" , 0, KW_NO_APPLY, false),
new Keyword("no-array-message" , 0, KW_NO_ARMSG, false),
new Keyword("no-assign" , 0, KW_NO_ASSGN, false),
new Keyword("no-attr-list" , 7, KW_NO_ATTRL, true ),
new Keyword("no-attr-space" , 7, KW_NO_ATTR , true ),
new Keyword("no-auto-validate" , 0, KW_NO_AUTOV, false),
new Keyword("no-bind-where" , 0, KW_NO_BIND , false),
new Keyword("no-box" , 0, KW_NO_BOX , false),
new Keyword("no-column-scrolling" , 0, KW_NO_COLS , false), // missing in keyword index, found in customer source code.
new Keyword("no-console" , 0, KW_NO_CONS , false),
new Keyword("no-convert" , 0, KW_NO_CVT , false),
new Keyword("no-convert-3d-colors" , 0, KW_NO_CV_3D, false),
new Keyword("no-current-value" , 0, KW_NO_CUR_V, false),
new Keyword("no-debug" , 0, KW_NO_DEBUG, false),
new Keyword("no-drag" , 0, KW_NO_DRAG , false),
new Keyword("no-echo" , 0, KW_NO_ECHO , false),
new Keyword("no-empty-space" , 0, KW_NO_EM_SP, false),
new Keyword("no-enhanced-filtering" , 0, KW_NO_EH_FL, false), // FWD extension, not a real 4GL keyword
new Keyword("no-enhanced-sorting" , 0, KW_NO_EH_SR, false), // FWD extension, not a real 4GL keyword
new Keyword("no-error" , 0, KW_NO_ERROR, true ),
new Keyword("no-fill" , 4, KW_NO_FILL , true ),
new Keyword("no-focus" , 0, KW_NO_FOCUS, true ),
new Keyword("no-help" , 0, KW_NO_HELP , false),
new Keyword("no-hide" , 0, KW_NO_HIDE , true ),
new Keyword("no-index-hint" , 0, KW_NO_IDX_H, false),
new Keyword("no-inherit-bgcolor" , 14, KW_NO_INHBG, false),
new Keyword("no-inherit-fgcolor" , 14, KW_NO_INHFG, false),
new Keyword("no-join-by-sqldb" , 0, KW_NO_JOIN , false),
new Keyword("no-labels" , 8, KW_NO_LABEL, true ),
new Keyword("no-lobs" , 0, KW_NO_LOBS , true ),
new Keyword("no-lock" , 0, KW_NO_LOCK , true ),
new Keyword("no-lookahead" , 0, KW_NO_LOOKA, false),
new Keyword("no-map" , 0, KW_NO_MAP , true ),
new Keyword("no-message" , 6, KW_NO_MSG , true ),
new Keyword("no-pause" , 0, KW_NO_PAUSE, true ),
new Keyword("no-prefetch" , 8, KW_NO_PRE , true ),
new Keyword("no-row-markers" , 0, KW_NO_ROW_M, false),
new Keyword("no-return-value" , 13, KW_NO_RET_V, true ), // missing in keyword index, found elsewhere in external program interface ref
new Keyword("no-schema-marshal" , 0, KW_NO_SCH_M, false), // missing from keyword index and UNTESTED at this time
new Keyword("no-scrollbar-vertical" , 0, KW_NO_SCR_V, false),
new Keyword("no-separators" , 0, KW_NO_SEPS , false),
new Keyword("no-separate-connection" , 0, KW_NO_SEP_C, false),
new Keyword("no-tab-stop" , 0, KW_NO_TAB_S, false),
new Keyword("no-underline" , 6, KW_NO_UNDL , false),
new Keyword("no-undo" , 0, KW_NO_UNDO , true ),
new Keyword("no-validate" , 6, KW_NO_VALID, true ),
new Keyword("no-wait" , 0, KW_NO_WAIT , true ),
new Keyword("no-word-wrap" , 0, KW_NO_WRAP , false),
new Keyword("node-bold" , 0, KW_NODE_BLD, false), // FWD extension, not a real 4GL keyword
new Keyword("node-click" , 0, KW_N_CLICK , false), // FWD extension, not a real 4GL keyword
new Keyword("node-collapsed" , 0, KW_N_COLED , false), // FWD extension, not a real 4GL keyword
new Keyword("node-collapsing" , 0, KW_N_COLING, false), // FWD extension, not a real 4GL keyword
new Keyword("node-expanded" , 0, KW_N_EXPED , false), // FWD extension, not a real 4GL keyword
new Keyword("node-expanding" , 0, KW_N_EXPING, false), // FWD extension, not a real 4GL keyword
new Keyword("node-check" , 0, KW_NODE_CHE, false), // FWD extension, not a real 4GL keyword
new Keyword("node-count" , 0, KW_NODE_CNT, false), // FWD extension, not a real 4GL keyword
new Keyword("node-expanded" , 0, KW_NODE_EXP, false), // FWD extension, not a real 4GL keyword
new Keyword("node-height" , 0, KW_N_HEIGHT, false), // FWD extension, not a real 4GL keyword
new Keyword("node-icon" , 0, KW_NODE_ICO, false), // FWD extension, not a real 4GL keyword
new Keyword("node-id" , 0, KW_NODE_ID , false), // FWD extension, not a real 4GL keyword
new Keyword("node-index" , 0, KW_NODE_IDX, false), // FWD extension, not a real 4GL keyword
new Keyword("node-key" , 0, KW_NODE_KEY, false), // FWD extension, not a real 4GL keyword
new Keyword("node-key-to-id" , 0, KW_N_KEY_ID, false), // FWD extension, not a real 4GL keyword
new Keyword("node-parent" , 0, KW_NODE_PAR, false), // FWD extension, not a real 4GL keyword
new Keyword("node-text" , 0, KW_NODE_TXT, false), // FWD extension, not a real 4GL keyword
new Keyword("node-value" , 0, KW_NODE_VAL, false),
new Keyword("node-value-to-memptr" , 0, KW_NODE_V2M, false),
new Keyword("node-value-to-longchar" , 0, KW_NODV_2LC, false), // missing from keyword index and UNTESTED at this time
new Keyword("nodes" , 0, KW_NODES, false ), // FWD extension, not a real 4GL keyword
new Keyword("non-serializable" , 0, KW_NON_SER , false), // missing in keyword index, found elsewhere in lang ref, UNTESTED
new Keyword("nonamespace-schema-location" , 0, KW_NNMSP_SL, false),
new Keyword("none" , 0, KW_NONE , false),
new Keyword("normal" , 3, KW_NORMAL , false),
new Keyword("normalize" , 0, KW_NORMALZE, false),
new Keyword("not" , 0, KW_NOT , true ),
new Keyword("not-active" , 0, KW_NOT_ACTV, false),
new Keyword("now" , 0, KW_NOW , true ),
new Keyword("null" , 0, KW_NULL , true ),
new Keyword("num-aliases" , 7, KW_NUM_ALIA, true ),
new Keyword("num-buffers" , 0, KW_NUM_BUFF, false),
new Keyword("num-buttons" , 7, KW_NUM_BUTT, false),
new Keyword("num-children" , 0, KW_NUM_CHLN, false),
new Keyword("num-child-relations" , 0, KW_NUM_CH_R, false), // missing from keyword index and UNTESTED at this time
new Keyword("num-copies" , 0, KW_NUM_COPY, false),
new Keyword("num-columns" , 7, KW_NUM_COL , false),
new Keyword("num-dbs" , 0, KW_NUM_DBS , true ),
new Keyword("num-dropped-files" , 0, KW_NUM_DROP, false),
new Keyword("num-entries" , 0, KW_NUM_ENT , true ),
new Keyword("num-fields" , 0, KW_NUM_FLD , false),
new Keyword("num-formats" , 0, KW_NUM_FMTS, false),
new Keyword("num-header-entries" , 0, KW_NUM_HD_E, false), // missing from keyword index and UNTESTED at this time
new Keyword("num-items" , 0, KW_NUM_ITMS, false),
new Keyword("num-iterations" , 0, KW_NUM_ITER, false),
new Keyword("num-lines" , 0, KW_NUM_LNS , false),
new Keyword("num-locked-columns" , 14, KW_NUM_LK_C, false),
new Keyword("num-log-files" , 0, KW_NUM_LOGF, false), // missing from keyword index and UNTESTED at this time
new Keyword("num-messages" , 0, KW_NUM_MSG , false),
new Keyword("num-parameters" , 0, KW_NUM_PARM, false),
new Keyword("num-references" , 0, KW_NUM_REF , false),
new Keyword("num-relations" , 0, KW_NUM_REL , false), // missing from keyword index and UNTESTED at this time
new Keyword("num-replaced" , 0, KW_NUM_REPL, false),
new Keyword("num-results" , 0, KW_NUM_RES , false),
new Keyword("num-selected-rows" , 0, KW_NUM_SR , false),
new Keyword("num-selected-widgets" , 12, KW_NUM_SW , false),
new Keyword("num-source-buffers" , 0, KW_NUM_SRCB, false), // missing from keyword index and UNTESTED at this time
new Keyword("num-top-buffers" , 0, KW_NUM_TOPB, false), // missing from keyword index and UNTESTED at this time
new Keyword("num-tabs" , 0, KW_NUM_TABS, false),
new Keyword("num-to-retain" , 0, KW_NUM_2RTN, false),
new Keyword("num-visible-columns" , 0, KW_NUM_V_C , false),
new Keyword("numberoftabletpoints" , 0, KW_NUM_PNTS, false), // FWD extension, not a real 4GL keyword
new Keyword("numeric" , 0, KW_NUMERIC , false),
new Keyword("numeric-decimal-point" , 15, KW_NUM_D_P , false),
new Keyword("numeric-format" , 9, KW_NUM_FMT , false),
new Keyword("numeric-separator" , 0, KW_NUM_SEP , false),
new Keyword("object" , 0, KW_OBJECT , false),
new Keyword("octet-length" , 0, KW_OCT_LEN , false),
new Keyword("ocx-mouse-button" , 0, KW_OCX_MBTN, false), // FWD extension, not a real 4GL keyword
new Keyword("mouse-icon" , 0, KW_MSICON, false), // FWD WidgetExtension extension, not a real 4GL keyword
new Keyword("mouse-pointer-num" , 0, KW_MSPNTNUM, false), // FWD WidgetExtension extension, not a real 4GL keyword
new Keyword("ocx-mouse-shift" , 0, KW_OCX_MSHT, false), // FWD extension, not a real 4GL keyword
new Keyword("ocx-mouse-x" , 0, KW_OCX_MSX , false), // FWD extension, not a real 4GL keyword
new Keyword("ocx-mouse-y" , 0, KW_OCX_MSY , false), // FWD extension, not a real 4GL keyword
new Keyword("of" , 0, KW_OF , true ),
new Keyword("off-end" , 0, KW_OFF_END , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("off-home" , 0, KW_OFF_HOME, false), // missing in keyword index, found elsewhere in lang ref
new Keyword("off" , 0, KW_OFF , true ),
new Keyword("ok" , 0, KW_OK , false),
new Keyword("ok-cancel" , 0, KW_OK_CAN , false),
new Keyword("old" , 0, KW_OLD , true ),
new Keyword("ole-invoke-locale" , 0, KW_OLE_INVL, false),
new Keyword("ole-names-locale" , 0, KW_OLE_NAML, false),
new Keyword("ole-complete-drag" , 0, KW_OLE_CDRG, false), // FWD extension, not a real 4GL keyword
new Keyword("ole-drag-drop" , 0, KW_OLE_DD , false), // FWD extension, not a real 4GL keyword
new Keyword("ole-drag-over" , 0, KW_OLE_DGOV, false), // FWD extension, not a real 4GL keyword
new Keyword("ole-give-feedback" , 0, KW_OLE_GIVF, false), // FWD extension, not a real 4GL keyword
new Keyword("ole-set-data" , 0, KW_OLE_SETD, false), // FWD extension, not a real 4GL keyword
new Keyword("ole-start-drag" , 0, KW_OLE_STDG, false), // FWD extension, not a real 4GL keyword
new Keyword("ole-allowed-effects" , 0, KW_OLE_AEFF, false), // FWD extension, not a real 4GL keyword
new Keyword("ole-data-format" , 0, KW_OLE_DATF, false), // FWD extension, not a real 4GL keyword
new Keyword("ole-drag" , 0, KW_OLE_DRAG, false), // FWD extension, not a real 4GL keyword
new Keyword("ole-default-cursors" , 0, KW_OLE_DEFC, false), // FWD extension, not a real 4GL keyword
new Keyword("ole-drag-mode" , 0, KW_OLE_DGMD, false), // FWD extension, not a real 4GL keyword
new Keyword("ole-drop-mode" , 0, KW_OLE_DRMD, false), // FWD extension, not a real 4GL keyword
new Keyword("ole-state" , 0, KW_OLE_STAT, false), // FWD extension, not a real 4GL keyword
new Keyword("ole-x" , 0, KW_OLE_X, false), // FWD extension, not a real 4GL keyword
new Keyword("ole-y" , 0, KW_OLE_Y, false), // FWD extension, not a real 4GL keyword
new Keyword("ole-effect" , 0, KW_OLE_EFFE, false), // FWD extension, not a real 4GL keyword
new Keyword("dragged-node" , 0, KW_DRAG_NOD, false), // FWD extension, not a real 4GL keyword
new Keyword("dragged-over-node" , 0, KW_DRAG_OVR, false), // FWD extension, not a real 4GL keyword
new Keyword("on" , 0, KW_ON , true ),
new Keyword("on-frame-border" , 8, KW_ON_FR_B , false),
new Keyword("only" , 0, KW_ONLY , false),
new Keyword("open" , 0, KW_OPEN , true ),
new Keyword("open-html-string" , 0, KW_OPENHTML, true ), // FWD extension, not real 4GL!
new Keyword("open-line-above" , 0, KW_OPEN_L_A, false), // missing in keyword index, found in prog handbook as a key function
new Keyword("open-mime-resource" , 0, KW_OPENMIME, false), // FWD extension, not real 4GL!
new Keyword("open-popup" , 0, KW_OPENPOPU, false), // FWD extension, not real 4GL!
new Keyword("open-web-page" , 0, KW_OPENPAGE, true ), // FWD extension, not real 4GL!
new Keyword("open-url" , 0, KW_OPEN_URL, false), // FWD-extension, not real 4GL!
new Keyword("opsys" , 0, KW_OPSYS , true ),
new Keyword("option" , 0, KW_OPTION , true ),
new Keyword("options" , 0, KW_OPTIONS , false), // missing in keyword index, found in prog handbook as a key function
new Keyword("options-file" , 0, KW_OPTIONSF, false), // missing in keyword index, found in prog handbook as a key function
new Keyword("or" , 0, KW_OR , true ),
new Keyword("ordinal" , 0, KW_ORDINAL , false),
new Keyword("order" , 0, KW_ORDER , false), // missing in keyword index, found in SQL reference
new Keyword("ordered-join" , 0, KW_ORD_JOIN, false),
new Keyword("origin-handle" , 0, KW_ORG_HAND, false), // missing from keyword index and UNTESTED at this time
new Keyword("origin-rowid" , 0, KW_ORG_ROID, false), // missing from keyword index and UNTESTED at this time
new Keyword("os2" , 0, KW_OS2 , true ), // undocumented
new Keyword("os-append" , 0, KW_OS_APPND, true ),
new Keyword("os-copy" , 0, KW_OS_COPY , true ),
new Keyword("os-command" , 0, KW_OS_CMD , true ),
new Keyword("os-create-dir" , 0, KW_OS_MKDIR, true ),
new Keyword("os-drives" , 8, KW_OS_DRV , false),
new Keyword("os-delete" , 0, KW_OS_DEL , true ),
new Keyword("os-dir" , 0, KW_OS_DIR , true ),
new Keyword("os-error" , 0, KW_OS_ERR , false),
new Keyword("os-getenv" , 0, KW_OS_G_ENV, false),
new Keyword("os-rename" , 0, KW_OS_REN , true ),
new Keyword("os-userid" , 0, KW_OS_UID , false), // FWD-extension, not real 4GL!
new Keyword("otherwise" , 0, KW_OTHER , true ),
new Keyword("outer-join" , 0, KW_OUT_JOIN, false), // missing in keyword index, found elsewhere in lang ref
new Keyword("outer" , 0, KW_OUTER , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("output" , 0, KW_OUTPUT , true ),
new Keyword("outputcontenttype" , 0, KW_OUTPUTCT, false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("output-content-type" , 0, KW_OUTPUTCT, false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("outputheaders" , 0, KW_OUT_HDR , false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("outputheader" , 0, KW_OUT_HDR , false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("outputhttpheader" , 0, KW_OUT_HH , false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("output-http-header" , 0, KW_OUT_HH , false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("output-messages" , 0, KW_OUT_MSGS, false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("overlay" , 0, KW_OVERLAY , true ),
new Keyword("override" , 0, KW_OVERRIDE, false),
new Keyword("owner" , 0, KW_OWNER , false),
new Keyword("owner-document" , 0, KW_OWN_DOC , false),
new Keyword("p2j-remote-call" , 0, KW_P2J_RC , false), // P2J-extension, not real 4GL!
new Keyword("package-private" , 0, KW_PK_PRIV, false),
new Keyword("package-protected" , 0, KW_PK_PROT, false),
new Keyword("page" , 0, KW_PAGE , true ),
new Keyword("paged" , 0, KW_PAGED , false),
new Keyword("page-bottom" , 8, KW_PAGE_B , true ),
new Keyword("page-down" , 0, KW_PAGE_DWN, false), // missing in keyword index, found in prog handbook as a key function
new Keyword("page-left" , 0, KW_PAGE_LFT, false), // missing in keyword index, found in prog handbook as a key function
new Keyword("page-number" , 8, KW_PAGE_NUM, true ),
new Keyword("page-right" , 0, KW_PAGE_RT , false), // missing in keyword index, found in prog handbook as a key function
new Keyword("page-size" , 0, KW_PAGE_SZ , false),
new Keyword("page-top" , 0, KW_PAGE_T , true ),
new Keyword("page-up" , 0, KW_PAGE_UP , false), // missing in keyword index, found in prog handbook as a key function
new Keyword("page-width" , 8, KW_PAGE_WID, false),
new Keyword("parameter" , 5, KW_PARM , true ),
new Keyword("parent-buffer" , 0, KW_PAR_BUFF, false), // missing from keyword index and UNTESTED at this time
new Keyword("parent-fields-after" , 0, KW_PAR_FLDA, false),
new Keyword("parent-fields-before" , 0, KW_PAR_FLDB, false),
new Keyword("parent-id-field" , 0, KW_PAR_IFLD, false), // missing from keyword index and UNTESTED at this time
new Keyword("parent-id-relation" , 0, KW_PAR_IREL, false), // missing from keyword index and UNTESTED at this time
new Keyword("parent-relation" , 0, KW_PAR_REL , false), // missing from keyword index and UNTESTED at this time
new Keyword("parent-window-close" , 0, KW_PAR_W_C , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("parent" , 0, KW_PARENT , false),
new Keyword("parse-status" , 0, KW_PARSE_ST, false),
new Keyword("partial-key" , 0, KW_PART_KEY, false),
new Keyword("pathname" , 0, KW_PATHNAME, false),
new Keyword("pascal" , 0, KW_PASCAL , false),
new Keyword("password-field" , 0, KW_PASSWD_F, true ),
new Keyword("paste" , 0, KW_PASTE , false), // missing in keyword index, found in prog handbook as a key function
new Keyword("pause" , 0, KW_PAUSE , true ),
new Keyword("pbe-hash-algorithm" , 12, KW_PBE_H_AL, false),
new Keyword("pbe-key-rounds" , 0, KW_PBE_KEYR, false),
new Keyword("pdbname" , 0, KW_PDBNAME , true ),
new Keyword("performance" , 0, KW_PERF , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("persistent" , 7, KW_PERSIST , true ),
new Keyword("persistent-procedure" , 0, KW_PRS_PROC, false),
new Keyword("persistent-cache-disabled" , 0, KW_PRS_C_D , false),
new Keyword("pfcolor" , 3, KW_PFCOLOR , false),
new Keyword("pick" , 0, KW_PICK , false), // missing in keyword index, found in prog handbook as a key function
new Keyword("pick-area" , 0, KW_PICK_ARE, false), // missing in keyword index, found in prog handbook as a key function
new Keyword("pick-both" , 0, KW_PICK_BTH, false), // missing in keyword index, found in prog handbook as a key function
new Keyword("pixels" , 0, KW_PIXELS , true ),
new Keyword("pixels-per-column" , 14, KW_PIX_COL , false),
new Keyword("pixels-per-row" , 0, KW_PIX_ROW , false),
new Keyword("portrait" , 0, KW_PORTRAIT, false),
new Keyword("position" , 7, KW_POS , false),
new Keyword("post-message" , 0, KW_POSTMSG , true ), // FWD extension, not real 4GL!
new Keyword("popup-menu" , 7, KW_POP_MENU, false),
new Keyword("popup-only" , 7, KW_POP_ONLY, false),
new Keyword("precision" , 0, KW_PRECISN , false),
new Keyword("prefer-dataset" , 0, KW_PREF_DS , false),
new Keyword("prepare-string" , 0, KW_PREP_STR, false),
new Keyword("prepared" , 0, KW_PREPARED, false),
new Keyword("preprocess" , 7, KW_PREPROC , true ),
new Keyword("preprocessed-label" , 0, KW_PRE_LBL , false), // FWD extension, not real 4GL!
new Keyword("preselect" , 6, KW_PRESEL , false),
new Keyword("prev" , 0, KW_PREV , false),
new Keyword("prev-column" , 0, KW_PREV_COL, false),
new Keyword("prev-frame" , 0, KW_PREV_FR , false),
new Keyword("prev-sibling" , 0, KW_PREV_SIB, false),
new Keyword("prev-tab-item" , 10, KW_PREV_T_I, false),
new Keyword("prev-word" , 0, KW_PREVWORD, false), // missing in keyword index, found in prog handbook as a key function
new Keyword("primary" , 0, KW_PRIMARY , false),
new Keyword("primary-passphrase" , 0, KW_PRIM_P_P, false), // PRIMARY-PASSPHRASE
new Keyword("print" , 0, KW_PRINT, false), // FWD extension, not real 4GL!
new Keyword("printer" , 0, KW_PRINTER , false),
new Keyword("printer-control-handle" , 0, KW_PRT_C_H , false),
new Keyword("printer-hdc" , 0, KW_PRT_HDC , false),
new Keyword("printer-name" , 0, KW_PRT_NAME, false),
new Keyword("printer-port" , 0, KW_PRT_PORT, false),
new Keyword("printer-setup" , 0, KW_PRT_SET , false),
new Keyword("private" , 0, KW_PRIVATE , false),
new Keyword("private-data" , 9, KW_PRIV_DAT, false),
new Keyword("privileges" , 0, KW_PRIVILEG, true ),
new Keyword("procedure-name" , 0, KW_PROCNAME, false),
new Keyword("procedure-call-type" , 0, KW_PROC_C_T, true ),
new Keyword("procedure-complete" , 0, KW_PROC_COM, false), // missing in keyword index, found elsewhere in lang ref
new Keyword("procedure-type" , 0, KW_PROCTYPE, false),
new Keyword("procedure" , 5, KW_PROC , false),
new Keyword("process-architecture" , 0, KW_PRO_ARCH, false), // this is not reserved, but attempting to declare a var with the same name will not be able to alter it at runtime (remains constant)
new Keyword("process-web-request" , 0, KW_PROC_W_R, false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("process" , 0, KW_PROCESS , true ),
new Keyword("proc-handle" , 7, KW_PROC_HND, true ),
new Keyword("proc-status" , 7, KW_PROC_ST , true ),
new Keyword("proc-text" , 0, KW_PROC_TXT, false),
new Keyword("proc-text-buffer" , 0, KW_PROC_T_B, false),
new Keyword("prodataset" , 0, KW_PRODATAS, false), // missing from keyword index and UNTESTED at this time
new Keyword("profiler" , 0, KW_PROFILER, true ),
new Keyword("profiling" , 0, KW_PROFILNG, false), // missing from keyword index, found in customer code and UNTESTED at this time
new Keyword("program-name" , 0, KW_PROGNAME, true ),
new Keyword("progress" , 0, KW_PROGRESS, true ),
new Keyword("progress-bar" , 0, KW_PROG_BAR, false), // FWD PROGRESS-BAR extension, not a real 4GL keyword
new Keyword("pb-appearance" , 0, KW_PB_APPEA, false), // FWD PROGRESS-BAR extension, not a real 4GL keyword
new Keyword("pb-border-style" , 0, KW_PB_BRSTY, false), // FWD PROGRESS-BAR extension, not a real 4GL keyword
new Keyword("pb-enabled" , 0, KW_PB_ENABL, false), // FWD PROGRESS-BAR extension, not a real 4GL keyword
new Keyword("pb-max" , 0, KW_PB_MAX , false), // FWD PROGRESS-BAR extension, not a real 4GL keyword
new Keyword("pb-min" , 0, KW_PB_MIN , false), // FWD PROGRESS-BAR extension, not a real 4GL keyword
new Keyword("pb-orientation" , 0, KW_PB_ORIEN, false), // FWD PROGRESS-BAR extension, not a real 4GL keyword
new Keyword("pb-scrolling" , 0, KW_PB_SCROL, false), // FWD PROGRESS-BAR extension, not a real 4GL keyword
new Keyword("pb-value" , 0, KW_PB_VALUE, false), // FWD PROGRESS-BAR extension, not a real 4GL keyword
new Keyword("progress-source" , 10, KW_PROG_SRC, false),
new Keyword("prompt" , 0, KW_PROMPT , true), // keyword index lists this as unreserved, which is incorrect
new Keyword("prompt-for" , 8, KW_PRMT_FOR, true ),
new Keyword("promsgs" , 0, KW_PROMSGS , true ),
new Keyword("propath" , 0, KW_PROPATH , true ),
new Keyword("property" , 0, KW_PROPERTY, false),
new Keyword("protected" , 0, KW_PROTECTD, false),
new Keyword("proversion" , 7, KW_PROVER , true ),
new Keyword("proxy" , 0, KW_PROXY , false),
new Keyword("proxy-password" , 0, KW_PROX_PWD, false),
new Keyword("proxy-userid" , 0, KW_PROX_UID, false),
new Keyword("public-id" , 0, KW_PUB_ID , false),
new Keyword("public" , 0, KW_PUBLIC , false),
new Keyword("publish" , 0, KW_PUBLISH , true), // keyword index lists this as unreserved, which is incorrect
new Keyword("published-events" , 0, KW_PUB_EVTS, false),
new Keyword("put" , 0, KW_PUT , true ),
new Keyword("put-bits" , 0, KW_PUT_BITS, false),
new Keyword("putbyte" , 0, KW_PUT_BYTE, true ),
new Keyword("put-byte" , 0, KW_PUT_BYTE, true ),
new Keyword("put-int64" , 0, KW_PUT_I64 , false),
new Keyword("put-bytes" , 0, KW_PUT_BYTS, false),
new Keyword("put-double" , 0, KW_PUT_DBL , false),
new Keyword("put-float" , 0, KW_PUT_FLT , false),
new Keyword("put-key-value" , 11, KW_PUT_K_V , true ),
new Keyword("put-long" , 0, KW_PUT_LONG, false),
new Keyword("put-short" , 0, KW_PUT_SHT , false),
new Keyword("put-string" , 0, KW_PUT_STR , false),
new Keyword("put-unsigned-long" , 0, KW_PUT_UL , false),
new Keyword("put-unsigned-short" , 0, KW_PUT_USHT, false), // missing in keyword index, found elsewhere in lang ref
new Keyword("qualified-user-id" , 0, KW_QUAL_UID, false),
new Keyword("query" , 0, KW_QUERY , true ),
new Keyword("query-close" , 0, KW_QRY_CLOS, true ),
new Keyword("query-off-end" , 0, KW_QRY_OFF , true ),
new Keyword("query-open" , 0, KW_QRY_OPEN, false),
new Keyword("query-prepare" , 0, KW_QRY_PREP, false),
new Keyword("query-tuning" , 0, KW_QRY_TUNE, true ),
new Keyword("question" , 0, KW_QUEST , false),
new Keyword("queue-message" , 0, KW_QUE_MSG , false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("quit" , 0, KW_QUIT , true ),
new Keyword("quoter" , 0, KW_QUOTER , false),
new Keyword("r-index" , 0, KW_R_INDEX , true ),
new Keyword("radio-buttons" , 0, KW_RADIO_B , false),
new Keyword("radio-set" , 0, KW_RADIO_S , false),
new Keyword("random" , 0, KW_RANDOM , false),
new Keyword("raw" , 0, KW_RAW , false),
new Keyword("raw-transfer" , 0, KW_RAW_TRAN, false),
new Keyword("rcode-information" , 10, KW_RCOD_INF, true ),
new Keyword("readkey" , 0, KW_READKEY , true ),
new Keyword("real" , 0, KW_REAL , false),
new Keyword("read" , 0, KW_READ , false),
new Keyword("read-available" , 0, KW_READ_AVL, true ),
new Keyword("read-exact-num" , 0, KW_READ_E_N, true ),
new Keyword("read-file" , 0, KW_READ_FIL, false),
new Keyword("read-json" , 0, KW_READ_JSN, false),
new Keyword("read-only" , 0, KW_READ_ONL, false),
new Keyword("read-response" , 0, KW_READ_RES, false), // missing in keyword index, found elsewhere in lang ref
new Keyword("read-xml" , 0, KW_READ_XML, false),
new Keyword("read-xmlschema" , 0, KW_READ_XSC, false),
new Keyword("recall" , 0, KW_RECALL , false),
new Keyword("recid" , 0, KW_RECID , true ),
new Keyword("record-length" , 0, KW_REC_LEN , false),
new Keyword("rectangle" , 4, KW_RECT , true ),
new Keyword("recursive" , 0, KW_RECURSE , false),
new Keyword("reference-only" , 0, KW_REF_ONLY, false),
new Keyword("refresh" , 0, KW_REFRESH , false),
new Keyword("refresh-audit-policy" , 0, KW_REFR_A_P, false),
new Keyword("refreshable" , 0, KW_REFRABLE, false),
new Keyword("refresh-ui" , 0, KW_RFRSH_UI, false), // FWD WidgetExtension extension, not a real 4GL keyword
new Keyword("register" , 0, KW_REGISTER, false), // FWD extension, not a real 4GL keyword
new Keyword("register-domain" , 0, KW_REG_DMN , false),
new Keyword("reject-changes" , 0, KW_REJ_CHGS, false), // missing from keyword index and UNTESTED at this time
new Keyword("reject-row-changes" , 0, KW_REJ_RCHG, false), // missing from keyword index and UNTESTED at this time
new Keyword("rejected" , 0, KW_REJECTED, false), // missing from keyword index and UNTESTED at this time
new Keyword("related-session-id" , 0, KW_RELSESID, false), // FWD extension, not a real 4GL keyword
new Keyword("relation-fields" , 0, KW_REL_FLDS, false), // missing from keyword index and UNTESTED at this time
new Keyword("relations-active" , 0, KW_RELS_ACT, false), // missing from keyword index and UNTESTED at this time
new Keyword("release" , 0, KW_RELEASE , true ),
new Keyword("remote-host" , 0, KW_REM_HOST, false),
new Keyword("remote-port" , 0, KW_REM_PORT, false),
new Keyword("remote" , 0, KW_REMOTE , false),
new Keyword("remove-attribute" , 0, KW_REM_ATTR, false),
new Keyword("remove-child" , 0, KW_REM_CHLD, false),
new Keyword("remove-events-procedure" , 0, KW_REM_EVTP, false),
new Keyword("remove-node" , 0, KW_REM_NODE, false), // FWD extension, not a real 4GL keyword
new Keyword("remove-node-on-collapse" , 0, KW_REM_NOCO, false), // FWD extension, not a real 4GL keyword
new Keyword("remove-super-procedure" , 0, KW_REM_SUP , false),
new Keyword("repeat" , 0, KW_REPEAT , true ),
new Keyword("replace" , 0, KW_REPLACE , false),
new Keyword("replace-child" , 0, KW_REP_CHLD, false),
new Keyword("replace-selection-text" , 0, KW_REP_STXT, false),
new Keyword("replication-create" , 0, KW_REPL_CRE, false),
new Keyword("replication-delete" , 0, KW_REPL_DEL, false),
new Keyword("replication-write" , 0, KW_REPL_WRI, false),
new Keyword("report" , 0, KW_REPORT , false), // FWD extension, not real 4GL; Jasper report
new Keyword("report-data-source" , 0, KW_RPT_SRC , false), // FWD extension, not real 4GL; query for Jasper report
new Keyword("report-design" , 0, KW_RPT_DSGN, false), // FWD extension, not real 4GL; design file for Jasper report
new Keyword("reports" , 0, KW_REPORTS , false), // missing in keyword index, found in prog handbook as a key function
new Keyword("reposition" , 0, KW_REPOS , true ),
new Keyword("reposition-backwards" , 19, KW_REPOS_B , true ), // the documented keyword is reposition-backward with no abbrev, but customer code shows reposition-backwards as a valid alternative
new Keyword("reposition-forwards" , 18, KW_REPOS_F , true ), // the documented keyword is reposition-forward with no abbrev, but customer code shows reposition-forwards as a valid alternative
new Keyword("reposition-mode" , 0, KW_REPOS_M , false),
new Keyword("reposition-to-row" , 0, KW_REPOS_2R, true ),
new Keyword("reposition-to-rowid" , 0, KW_REPOS_2I, true ),
new Keyword("request" , 0, KW_REQUEST , false),
new Keyword("request-info" , 0, KW_REQ_INFO, false),
new Keyword("resource-base" , 0, KW_RES_BASE, false), // FWD extension, not a real 4GL keyword
new Keyword("response-info" , 0, KW_RSP_INFO, false),
new Keyword("reset" , 0, KW_RESET , false),
new Keyword("resize" , 0, KW_RESIZE , false),
new Keyword("resizable" , 6, KW_RESIZABL, false),
new Keyword("resort" , 0, KW_RESORT , false), // FWD extension, not a real 4GL keyword
new Keyword("restart-row" , 0, KW_REST_ROW, false),
new Keyword("restart-rowid" , 0, KW_REST_RID, false),
new Keyword("result" , 0, KW_RESULT , false),
new Keyword("resume-display" , 0, KW_RESUME_D, false), // missing in keyword index, found in prog handbook as a key function
new Keyword("retain" , 0, KW_RETAIN , true ),
new Keyword("retain-shape" , 0, KW_RET_SHAP, false),
new Keyword("retry" , 0, KW_RETRY , true ),
new Keyword("retry-cancel" , 0, KW_RETRY_C , false),
new Keyword("return" , 0, KW_RETURN , true ),
new Keyword("return-value-data-type" , 0, KW_RET_VDT , false),
new Keyword("return-value-dll-type" , 0, KW_RET_VLT , false),
new Keyword("returns" , 0, KW_RETURNS , false), // the Progress 4GL Reference incorrectly states this is reserved, but testing shows it is unreserved
new Keyword("return-inserted" , 10, KW_RET_INS , false),
new Keyword("return-value" , 10, KW_RET_VAL , false),
new Keyword("return-to-start-dir" , 18, KW_RET_2SD , false),
new Keyword("reverse-from" , 0, KW_REV_FROM, false),
new Keyword("revert" , 0, KW_REVERT , true ),
new Keyword("revoke" , 0, KW_REVOKE , true ),
new Keyword("rgb-value" , 0, KW_RGB_VAL , false),
new Keyword("right" , 0, KW_RIGHT , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("right-aligned" , 11, KW_RIGHT_AL, false),
new Keyword("right-end" , 0, KW_RT_END , false), // missing from keyword index, found elsewhere in lang ref
new Keyword("right-mouse-click" , 0, KW_RT_MC , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("right-mouse-dblclick" , 0, KW_RT_MDC , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("right-mouse-down" , 0, KW_RT_MD , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("right-mouse-up" , 0, KW_RT_MU , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("rt-opsys" , 0, KW_RTOPSYS , true ), // FWD extension, not real 4GL!
new Keyword("right-trim" , 0, KW_R_TRIM , false),
new Keyword("role" , 0, KW_ROLE , false), // missing from keyword index and UNTESTED at this time
new Keyword("roles" , 0, KW_ROLES , false),
new Keyword("round" , 0, KW_ROUND , false),
new Keyword("rounded" , 0, KW_ROUNDED , false), // missing from keyword index and UNTESTED at this time
new Keyword("routine-level" , 0, KW_ROUTINEL, false),
new Keyword("row" , 0, KW_ROW , false),
new Keyword("row-create" , 0, KW_ROW_CRT , false), // missing from keyword index and UNTESTED at this time
new Keyword("row-created" , 0, KW_ROW_CRTD, true ), // missing from keyword index, found elsewhere in lang ref, TESTED
new Keyword("row-delete" , 0, KW_ROW_DEL , false), // missing from keyword index and UNTESTED at this time
new Keyword("row-deleted" , 0, KW_ROW_DELD, true ), // missing from keyword index, found elsewhere in lang ref, TESTED
new Keyword("row-display" , 0, KW_ROW_DISP, false), // missing in keyword index, found elsewhere in lang ref
new Keyword("row-entry" , 0, KW_ROW_ENTR, false), // missing in keyword index, found elsewhere in lang ref
new Keyword("row-height-chars" , 10, KW_ROW_H_C , false),
new Keyword("row-height-pixels" , 12, KW_ROW_H_P , false),
new Keyword("row-leave" , 0, KW_ROW_LEAV, false), // missing in keyword index, found elsewhere in lang ref
new Keyword("row-markers" , 6, KW_ROW_MARK, false), // the abbreviation here is undocumented, but found in customer source, TESTED
new Keyword("row-modified" , 0, KW_ROW_MODD, true ), // missing from keyword index, found elsewhere in lang ref, TESTED
new Keyword("row-resizable" , 0, KW_ROW_RESZ, false),
new Keyword("row-state" , 0, KW_ROW_STAT, false), // missing from keyword index and UNTESTED at this time
new Keyword("row-unmodified" , 0, KW_ROW_UMOD, true ), // missing from keyword index, found elsewhere in lang ref, TESTED
new Keyword("row-update" , 0, KW_ROW_UPD , false), // missing from keyword index and UNTESTED at this time
new Keyword("rowid" , 0, KW_ROWID , false ), // documented as reserved in the keyword index, but found to be unreserved
new Keyword("row-of" , 0, KW_ROW_OF , false),
new Keyword("rule" , 0, KW_RULE , false),
new Keyword("rule-row" , 0, KW_RULE_ROW, false),
new Keyword("rule-y" , 0, KW_RULE_Y , false),
new Keyword("run-procedure" , 0, KW_RUN_PROC, false),
new Keyword("run-web-object" , 0, KW_RUN_W_O , false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("run" , 0, KW_RUN , true ),
new Keyword("save" , 0, KW_SAVE , true ),
new Keyword("save-as" , 0, KW_SAVE_AS , false),
new Keyword("save-file" , 0, KW_SAVE_FIL, false),
new Keyword("save-row-changes" , 0, KW_SAVE_RCH, false), // missing from keyword index and UNTESTED at this time
new Keyword("save-where-string" , 0, KW_SAVE_WST, false), // missing from keyword index and UNTESTED at this time
new Keyword("sax-attributes" , 0, KW_SAX_ATTR, false), // missing from keyword index and UNTESTED at this time
new Keyword("sax-complete" , 10, KW_SAX_COMP, true ),
new Keyword("sax-parse" , 0, KW_SAX_PARS, false),
new Keyword("sax-parser-error" , 0, KW_SAX_PARE, true ),
new Keyword("sax-parse-first" , 0, KW_SAX_PARF, false),
new Keyword("sax-parse-next" , 0, KW_SAX_PARN, false),
new Keyword("sax-reader" , 0, KW_SAX_READ, false), // missing from keyword index and UNTESTED at this time
new Keyword("sax-running" , 0, KW_SAX_RUNN, true ),
new Keyword("sax-uninitialized" , 0, KW_SAX_UNIN, true ),
new Keyword("sax-write-begin" , 0, KW_SAX_WBEG, true ),
new Keyword("sax-write-complete" , 0, KW_SAX_WCOM, true ),
new Keyword("sax-write-content" , 0, KW_SAX_WCON, true ),
new Keyword("sax-write-element" , 0, KW_SAX_WELM, true ),
new Keyword("sax-write-error" , 0, KW_SAX_WERR, true ),
new Keyword("sax-write-idle" , 0, KW_SAX_WIDL, true ),
new Keyword("sax-write-tag" , 0, KW_SAX_WTAG, true ),
new Keyword("sax-writer" , 0, KW_SAX_WRIT, false),
new Keyword("schema" , 0, KW_SCHEMA , true ),
new Keyword("schema-change" , 0, KW_SCH_CHG , false), // missing from keyword index and UNTESTED at this time
new Keyword("schema-location" , 0, KW_SCH_LOC , false),
new Keyword("schema-marshal" , 0, KW_SCH_MARS, false),
new Keyword("schema-path" , 0, KW_SCH_PATH, false),
new Keyword("screen" , 0, KW_SCREEN , true ),
new Keyword("screen-color-depth" , 0, KW_SCR_COL , false), // FWD extension, not a real 4GL keyword
new Keyword("screen-height" , 0, KW_SCR_HGHT, false), // FWD extension, not a real 4GL keyword
new Keyword("screen-io" , 0, KW_SCRN_IO , true ),
new Keyword("screen-lines" , 0, KW_SCRN_LNS, true ),
new Keyword("screen-scaling-factor" , 0, KW_SCR_SCAL, false), // FWD extension, not a real 4GL keyword
new Keyword("screen-value" , 9, KW_SCRN_VAL, true ),
new Keyword("screen-width" , 0, KW_SCR_WDTH, false), // FWD extension, not a real 4GL keyword
new Keyword("scroll" , 0, KW_SCROLL , true ),
new Keyword("scroll-bars" , 0, KW_SCROLLBA, false),
new Keyword("scroll-delta" , 0, KW_SCR_DELT, false),
new Keyword("scroll-left" , 0, KW_SCR_LEFT, false), // missing in keyword index, found in prog handbook as a key function
new Keyword("scroll-mode" , 0, KW_SCR_MODE, false), // missing from keyword index, found elsewhere in lang ref
new Keyword("scroll-node-count" , 0, KW_SCR_NODC, false ), // FWD extension, not a real 4GL keyword
new Keyword("scroll-node-to-top" , 0, KW_SCR_NTOP, false), // FWD extension, not a real 4GL keyword
new Keyword("scroll-notify" , 0, KW_SCR_NOT , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("scroll-offset" , 0, KW_SCR_OFFS, false),
new Keyword("scroll-right" , 0, KW_SCR_RT , false), // missing in keyword index, found in prog handbook as a key function
new Keyword("scroll-to-current-row" , 0, KW_SCR_2CR , false),
new Keyword("scroll-to-item" , 11, KW_SCR_2ITM, false),
new Keyword("scroll-to-selected-row" , 0, KW_SCR_2SR , false),
new Keyword("scroll-vertical" , 0, KW_SCR_VERT, false), // FWD extension, not a real 4GL keyword
new Keyword("scroll-wheel-lines" , 0, KW_SCR_WLNS, false), // FWD extension, not a real 4GL keyword
new Keyword("scrollable" , 0, KW_SCROLLBL, false),
new Keyword("scrollbar-horizontal" , 11, KW_SCROLL_H, false),
new Keyword("scrollbar-vertical" , 11, KW_SCROLL_V, false),
new Keyword("scrolled-row-position" , 16, KW_SCR_RPOS, false),
new Keyword("scrolling" , 0, KW_SCROLLIN, false),
new Keyword("sdbname" , 0, KW_SDBNAME , true ),
new Keyword("seal" , 0, KW_SEAL , false),
new Keyword("seal-timestamp" , 0, KW_SEAL_TST, false),
new Keyword("search" , 0, KW_SEARCH , true ),
new Keyword("search-self" , 0, KW_SEAR_SLF, true ),
new Keyword("search-target" , 0, KW_SEAR_TRG, true ),
new Keyword("section" , 0, KW_SECTION , false),
new Keyword("security-policy" , 0, KW_SECUR_P , true ),
new Keyword("seek" , 0, KW_SEEK , true ),
new Keyword("select" , 0, KW_SELECT , true ),
new Keyword("select-all" , 0, KW_SEL_ALL , false),
new Keyword("select-first-visible-node" , 0, KW_SEL_SFVN, false), // FWD extension, not a real 4GL keyword
new Keyword("select-focused-row" , 0, KW_SEL_FOCR, false),
new Keyword("select-next-row" , 0, KW_SEL_NEXT, false),
new Keyword("select-prev-row" , 0, KW_SEL_PREV, false),
new Keyword("select-row" , 0, KW_SEL_ROW , false),
new Keyword("selectable" , 0, KW_SELECTBL, false),
new Keyword("selected" , 0, KW_SELECTED, false),
new Keyword("selected-node" , 0, KW_SEL_NODE, false), // FWD extension, not a real 4GL keyword
new Keyword("selected-node-id" , 0, KW_SEL_NID, false), // FWD extension, not a real 4GL keyword
new Keyword("selected-node-key" , 0, KW_SEL_NKEY, false), // FWD extension, not a real 4GL keyword
new Keyword("selection" , 0, KW_SELECTN , false),
new Keyword("selection-end" , 0, KW_SEL_END , false),
new Keyword("selection-list" , 0, KW_SEL_LST , false),
new Keyword("selection-start" , 0, KW_SEL_STRT, false),
new Keyword("selection-text" , 0, KW_SEL_TXT , false),
new Keyword("self" , 0, KW_SELF , true ),
new Keyword("send" , 0, KW_SEND , false),
new Keyword("send-sql-statement" , 8, KW_SEND_SQL, false),
new Keyword("sensitive" , 0, KW_SENSITIV, false),
new Keyword("separate-connection" , 0, KW_SEP_CONN, false),
new Keyword("separator-fgcolor" , 0, KW_SEP_FGC , false),
new Keyword("separators" , 0, KW_SEPS , false),
new Keyword("serializable" , 0, KW_SERIALAB, false),
new Keyword("serialize-hidden" , 0, KW_SERIALZH, false),
new Keyword("serialize-name" , 0, KW_SERIALZN, false),
new Keyword("serialize-row" , 0, KW_SERIALZR, false), // missing in keyword index, found elsewhere in lang ref, UNTESTED
new Keyword("server" , 0, KW_SERVER , false),
new Keyword("server-connection-bound" , 0, KW_SRV_C_B , false),
new Keyword("server-connection-bound-request", 0, KW_SRV_C_BR, false),
new Keyword("server-connection-context" , 20, KW_SRV_C_C , false), // the 4GL docs state that there is no abbreviation, but customer code proves that abbrevations down to 20 characters are possible
new Keyword("server-connection-id" , 0, KW_SRV_C_I , false),
new Keyword("server-operating-mode" , 0, KW_SRV_OP_M, false),
new Keyword("server-socket" , 0, KW_SRV_SOCK, false), // missing in keyword index, found elsewhere in lang ref
new Keyword("session" , 0, KW_SESSION , true ),
new Keyword("session-end" , 0, KW_SESS_END, false), // missing from keyword index and UNTESTED at this time
new Keyword("session-id" , 0, KW_SESSN_ID, false),
new Keyword("set" , 0, KW_SET , true ),
new Keyword("setimagefileformat" , 0, KW_SET_IMGF, false), // FWD extension, not a real 4GL keyword
new Keyword("setimagepenwidth" , 0, KW_SET_PENW, false), // FWD extension, not a real 4GL keyword
new Keyword("setimagexsize" , 0, KW_SET_IMGH, false), // FWD extension, not a real 4GL keyword
new Keyword("setimageysize" , 0, KW_SET_IMGW, false), // FWD extension, not a real 4GL keyword
new Keyword("setjustifymode" , 0, KW_SET_JMOD, false), // FWD extension, not a real 4GL keyword
new Keyword("setjustifyx" , 0, KW_SET_JSTX, false), // FWD extension, not a real 4GL keyword
new Keyword("setjustifyy" , 0, KW_SET_JSTY, false), // FWD extension, not a real 4GL keyword
new Keyword("settings" , 0, KW_SETTINGS, false), // missing in keyword index, found in prog handbook as a key function
new Keyword("setlcdcapturemode" , 0, KW_SET_CPTM, false), // FWD extension, not a real 4GL keyword
new Keyword("setsigwindow" , 0, KW_SET_SWIN, false), // FWD extension, not a real 4GL keyword
new Keyword("settabletstate" , 0, KW_SET_TSTA, false), // FWD extension, not a real 4GL keyword
new Keyword("settranslatebitmapenable" , 0, KW_SET_TBME, false), // FWD extension, not a real 4GL keyword
new Keyword("setuserid" , 7, KW_SETUSER , true ),
new Keyword("set-actor" , 0, KW_SET_ACTR, false), // missing from keyword index and UNTESTED at this time
new Keyword("set-appl-context" , 0, KW_SET_ACTX, false),
new Keyword("set-attr-call-type" , 0, KW_SET_A_CT, true ),
new Keyword("set-attribute" , 0, KW_SET_ATTR, false),
new Keyword("set-attribute-list" , 0, KW_SET_A_L , false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("set-attribute-node" , 0, KW_SET_A_N , false),
new Keyword("set-blue-value" , 8, KW_SET_BLUE, false),
new Keyword("set-break" , 0, KW_SET_BRK , false),
new Keyword("set-buffers" , 0, KW_SET_BUF , false),
new Keyword("set-byte-order" , 0, KW_SET_B_OR, false),
new Keyword("set-callback" , 0, KW_SET_CBAC, false),
new Keyword("set-callback-procedure" , 0, KW_SET_CB_P, false), // missing from keyword index and UNTESTED at this time
new Keyword("set-cell-bgcolor" , 0, KW_S_C_BGCO, false), // FWD extension, not a real 4GL keyword
new Keyword("set-cell-fgcolor" , 0, KW_S_C_FGCO, false), // FWD extension, not a real 4GL keyword
new Keyword("set-cell-icon" , 0, KW_SET_C_IC, false), // FWD extension, not a real 4GL keyword
new Keyword("set-cell-string" , 0, KW_SET_C_S , false), // FWD extension, not a real 4GL keyword
new Keyword("set-client" , 0, KW_SET_CLNT, false),
new Keyword("set-column-caption" , 0, KW_S_COL_C , false), // FWD extension, not a real 4GL keyword
new Keyword("set-column-visible" , 0, KW_SET_C_VI, false), // FWD extension, not a real 4GL keyword
new Keyword("set-column-width" , 0, KW_S_COL_W , false), // FWD extension, not a real 4GL keyword
new Keyword("set-commit" , 0, KW_SET_COMM, false),
new Keyword("set-connect-procedure" , 0, KW_SET_C_P , false),
new Keyword("set-contents" , 0, KW_SET_CONT, false),
new Keyword("setcookie" , 0, KW_SET_COOK, false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("set-cookie" , 0, KW_SET_COOK, false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("set-db-client" , 0, KW_SET_DBCL, false),
new Keyword("set-dynamic" , 0, KW_SET_DYN , false),
new Keyword("set-event-manager-option" , 0, KW_SET_EVMO, false),
new Keyword("set-font-details" , 0, KW_SET_F_D , false), // FWD extension, not a real 4GL keyword
new Keyword("set-green-value" , 9, KW_SET_GRN , false),
new Keyword("set-input-source" , 0, KW_SET_ISRC, false),
new Keyword("set-lastkey" , 0, KW_SET_LSTK, false), // missing from keyword index, undocumented keyword found in customer code, confirmed as unreserved with no abbreviaton through testing
new Keyword("set-must-understand" , 0, KW_SET_M_UN, false), // missing from keyword index and UNTESTED at this time
new Keyword("set-multi-select" , 0, KW_SET_MSEL, false), // FWD extension, not a real 4GL keyword
new Keyword("set-node" , 0, KW_SET_NODE, false), // missing from keyword index and UNTESTED at this time
new Keyword("set-node-bgcolor" , 0, KW_SET_N_BG, false), // FWD extension, not a real 4GL keyword
new Keyword("set-node-fgcolor" , 0, KW_SET_N_FG, false), // FWD extension, not a real 4GL keyword
new Keyword("set-node-has-children" , 0, KW_SET_N_HC, false), // FWD extension, not a real 4GL keyword
new Keyword("set-node-text" , 0, KW_SET_NTXT, false), // FWD extension, not a real 4GL keyword
new Keyword("set-numeric-format" , 0, KW_SET_N_F , false),
new Keyword("set-option" , 0, KW_SET_OPT , false),
new Keyword("set-output-destination" , 0, KW_SET_ODST, false),
new Keyword("set-parameter" , 0, KW_SET_PARM, false),
new Keyword("set-property" , 0, KW_SET_PROP, false),
new Keyword("set-pointer-value" , 0, KW_SET_PTR , false),
new Keyword("set-read-response-procedure" , 0, KW_SET_RRP , false),
new Keyword("set-red-value" , 7, KW_SET_RED , false),
new Keyword("set-report-param" , 0, KW_SET_R_P , false), // FWD extension, not real 4GL; set parameter for Jasper report
new Keyword("set-repositioned-row" , 0, KW_SET_RPOS, false),
new Keyword("set-rgb-value" , 0, KW_SET_RGB , false),
new Keyword("set-rollback" , 0, KW_SET_ROLL, false),
new Keyword("set-selected-node-colors" , 0, KW_SET_SNC , false), // FWD extension, not a real 4GL keyword
new Keyword("set-selection" , 0, KW_SET_SEL , false),
new Keyword("set-serialized" , 0, KW_SET_SERD, false), // missing from keyword index and UNTESTED at this time
new Keyword("set-size" , 0, KW_SET_SZ , false),
new Keyword("set-socket-option" , 0, KW_SET_S_O , false),
new Keyword("set-sort-arrow" , 0, KW_SET_S_AR, false),
new Keyword("set-transaction-state" , 0, KW_SET_T_S , false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("set-tree-node-icons" , 0, KW_SET_TN_I, false), // FWD extension, not a real 4GL keyword
new Keyword("set-user-field" , 0, KW_SET_U_F , false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("set-wait-state" , 8, KW_SET_WAIT, false), // undocumented abbreviation found in customer source
new Keyword("set-working-directory" , 0, KW_SET_WKDR, false), // FWD extension, not real 4GL!
new Keyword("setwebstate" , 0, KW_SET_W_S , false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("sha1-digest" , 0, KW_SHA1_DIG, false),
new Keyword("share-lock" , 5, KW_SH_LOCK , true ),
new Keyword("shared" , 0, KW_SHARED , true ),
new Keyword("short" , 0, KW_SHORT , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("short-date-format" , 0, KW_SHR_D_F , false), // FWD extension, not a real 4GL keyword
new Keyword("show-buttons" , 0, KW_SHOW_BUT, false), // FWD extension, not a real 4GL keyword
new Keyword("show-header" , 0, KW_SHOW_HDR, false), // FWD extension, not a real 4GL keyword
new Keyword("show-in-taskbar" , 0, KW_SHOW_ITB, false),
new Keyword("show-stats" , 9, KW_SHOW_ST , true ),
new Keyword("side-labels" , 8, KW_SIDE_L , false),
new Keyword("side-label-handle" , 12, KW_SIDE_L_H, false),
new Keyword("signature" , 0, KW_SIGNATUR, false),
new Keyword("silent" , 0, KW_SILENT , false),
new Keyword("simple" , 0, KW_SIMPLE , false),
new Keyword("single" , 0, KW_SINGLE , false),
new Keyword("single-run" , 0, KW_SING_RUN, true),
new Keyword("singleton" , 0, KW_SINGLTON, false),
new Keyword("size" , 0, KW_SIZE , false),
new Keyword("size-chars" , 6, KW_SIZE_C , false),
new Keyword("size-pixels" , 6, KW_SIZE_P , false),
new Keyword("skip" , 0, KW_SKIP , true ),
new Keyword("skip-deleted-record" , 0, KW_SKIP_D_R, true ),
new Keyword("slider" , 0, KW_SLIDER , false),
new Keyword("small-icon" , 0, KW_SMAL_ICO, false),
new Keyword("small-title" , 0, KW_SMAL_TTL, false),
new Keyword("smallint" , 0, KW_SMALLINT, false),
new Keyword("smtp-email" , 0, KW_SMTP_EML, false), // FWD extension, not a real 4GL keyword
new Keyword("smtp-from" , 0, KW_SMTPFROM, false), // FWD extension, not a real 4GL keyword
new Keyword("smtp-host" , 0, KW_SMTPHOST, false), // FWD extension, not a real 4GL keyword
new Keyword("smtp-html" , 0, KW_SMTPHTML, false), // FWD extension, not a real 4GL keyword
new Keyword("smtp-port" , 0, KW_SMTPPORT, false), // FWD extension, not a real 4GL keyword
new Keyword("smtp-reply-to" , 0, KW_SMTPREPL, false), // FWD extension, not a real 4GL keyword
new Keyword("smtp-subject" , 0, KW_SMTPSUBJ, false), // FWD extension, not a real 4GL keyword
new Keyword("smtp-text" , 0, KW_SMTPTEXT, false), // FWD extension, not a real 4GL keyword
new Keyword("smtp-user" , 0, KW_SMTPUSER, false), // FWD extension, not a real 4GL keyword
new Keyword("smtp-password" , 0, KW_SMTP_PW, false), // FWD extension, not a real 4GL keyword
new Keyword("smtp-validate" , 0, KW_SMTP_VAL, false), // FWD extension, not a real 4GL keyword
new Keyword("soap-header" , 0, KW_SOAP_HDR, false), // missing from keyword index and UNTESTED at this time
new Keyword("soap-header-entryref" , 0, KW_SOAP_HER, false), // missing from keyword index and UNTESTED at this time
new Keyword("soap-fault" , 0, KW_SOAP_F , false), // missing from keyword index and UNTESTED at this time
new Keyword("soap-fault-actor" , 0, KW_SOAP_F_A, false), // missing from keyword index and UNTESTED at this time
new Keyword("soap-fault-code" , 0, KW_SOAP_F_C, false), // missing from keyword index and UNTESTED at this time
new Keyword("soap-fault-detail" , 0, KW_SOAP_F_D, false), // missing from keyword index and UNTESTED at this time
new Keyword("soap-fault-misunderstood-header", 0, KW_SOAP_FMH, false), // missing from keyword index and UNTESTED at this time
new Keyword("soap-fault-node" , 0, KW_SOAP_F_N, false), // missing from keyword index and UNTESTED at this time
new Keyword("soap-fault-role" , 0, KW_SOAP_F_R, false), // missing from keyword index and UNTESTED at this time
new Keyword("soap-fault-string" , 0, KW_SOAP_F_S, false), // missing from keyword index and UNTESTED at this time
new Keyword("soap-fault-subcode" , 0, KW_SOAP_FSC, false), // missing from keyword index and UNTESTED at this time
new Keyword("soap-version" , 0, KW_SOAP_VER, false), // missing from keyword index and UNTESTED at this time
new Keyword("socket" , 0, KW_SOCKET , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("some" , 0, KW_SOME , true ),
new Keyword("sort" , 0, KW_SORT , false),
new Keyword("sort-ascending" , 0, KW_SORT_ASC, false),
new Keyword("sort-number" , 0, KW_SORT_NUM, false),
new Keyword("sorted-column-count" , 0, KW_SOR_C_C , false), // FWD extension, not a real 4GL keyword
new Keyword("sorted-columns" , 0, KW_SOR_COLS, false), // FWD extension, not a real 4GL keyword
new Keyword("source" , 0, KW_SOURCE , false),
new Keyword("source-procedure" , 0, KW_SRC_PROC, false),
new Keyword("space" , 0, KW_SPACE , true ),
new Keyword("spreadsheet" , 0, KW_SPRSHEET, false), // FWD extension, not a real 4GL keyword
new Keyword("sql" , 0, KW_SQL , false),
new Keyword("sqrt" , 0, KW_SQRT , false),
new Keyword("ssl-server-name" , 0, KW_SSL_SRVN, false),
new Keyword("standalone" , 0, KW_STANDALN, false),
new Keyword("start" , 0, KW_START , false),
new Keyword("start-box-selection" , 0, KW_START_BS, false), // missing in keyword index, found elsewhere in lang ref
new Keyword("start-move" , 0, KW_START_MV, false),
new Keyword("start-document" , 0, KW_START_DC, false),
new Keyword("start-element" , 0, KW_START_EL, false),
new Keyword("start-resize" , 0, KW_START_RS, false),
new Keyword("start-row-resize" , 0, KW_START_RR, false),
new Keyword("start-search" , 0, KW_START_SC, false), // missing in keyword index, found elsewhere in lang ref
new Keyword("starting" , 0, KW_STARTING, false), // missing in keyword index, found elsewhere in lang ref
new Keyword("startup-parameters" , 0, KW_STUP_PAR, false), // missing from keyword index and UNTESTED at this time
new Keyword("state-detail" , 0, KW_STAT_DET, false),
new Keyword("static" , 0, KW_STATIC , false),
new Keyword("status" , 0, KW_STATUS , true ),
new Keyword("status-area" , 0, KW_STATUS_A, false),
new Keyword("status-area-font" , 0, KW_STAT_A_F, false),
new Keyword("stdcall" , 0, KW_STDCALL , false),
new Keyword("stop" , 0, KW_STOP , false),
new Keyword("stop-after" , 0, KW_STOP_AFT, true),
new Keyword("stop-display" , 0, KW_STOP_D , false), // missing in keyword index, found in prog handbook as a key function
new Keyword("stop-parsing" , 0, KW_STOP_PRS, false),
new Keyword("stopped" , 6, KW_STOPPED , false),
new Keyword("stored-procedure" , 11, KW_STORPROC, false),
new Keyword("stream" , 0, KW_STREAM , true ),
new Keyword("stream-handle" , 0, KW_STRM_HND, true ),
new Keyword("stream-io" , 0, KW_STRM_IO , true ),
new Keyword("stretch-to-fit" , 0, KW_ST_2_FIT, false),
new Keyword("strict" , 0, KW_STRICT , false),
new Keyword("strict-entity-resolution" , 0, KW_STRIC_ER, false),
new Keyword("string-value" , 0, KW_STR_VAL , false),
new Keyword("string-xref" , 0, KW_STR_XREF, false),
new Keyword("string" , 0, KW_STRING , false),
new Keyword("sub-average" , 7, KW_SUB_AVG , false),
new Keyword("sub-count" , 0, KW_SUB_CNT , false),
new Keyword("sub-maximum" , 7, KW_SUB_MAX , false),
new Keyword("sub-menu" , 4, KW_SUB_MENU, false),
new Keyword("sub-menu-help" , 0, KW_SUB_M_H , false),
new Keyword("sub-minimum" , 7, KW_SUB_MIN , false),
new Keyword("sub-total" , 0, KW_SUB_TOT , false),
new Keyword("subscribe" , 0, KW_SUBSCRIB, true), // keyword index lists this as unreserved, which is incorrect
new Keyword("subtype" , 0, KW_SUBTYPE , false),
new Keyword("sum" , 0, KW_SUM , false),
new Keyword("substitute" , 5, KW_SUBSTIT , false),
new Keyword("substring" , 6, KW_SUBSTR , false),
new Keyword("super" , 0, KW_SUPER , true ), // not documented as reserved, but in practice it is treated as such
new Keyword("super-procedures" , 10, KW_SUP_PROC, false), // not documented to have abbreviations but found to abbreviate via customer code
new Keyword("suppress-namespace-processing" , 0, KW_SUP_NS_P, false),
new Keyword("suppress-warnings" , 10, KW_SUP_WARN, false),
new Keyword("suppress-warnings-list" , 0, KW_SUPW_LST, false),
new Keyword("symmetric-encryption-algorithm" , 0, KW_SYM_EN_A, false),
new Keyword("symmetric-encryption-iv" , 0, KW_SYM_EN_I, false),
new Keyword("symmetric-encryption-key" , 0, KW_SYM_EN_K, false),
new Keyword("symmetric-support" , 0, KW_SYM_SUPP, false),
new Keyword("synchronize" , 0, KW_SYNCHRON, false), // missing from keyword index and UNTESTED at this time
new Keyword("system-alert-boxes" , 12, KW_SYS_A_B , false),
new Keyword("system-dialog" , 0, KW_SYS_DLG , true ),
new Keyword("system-help" , 0, KW_SYS_HELP, false),
new Keyword("system-id" , 0, KW_SYS_ID , false),
new Keyword("tab" , 0, KW_TAB , false),
new Keyword("tabletmodelnumber" , 0, KW_TAB_MOD, false), // FWD extension, not a real 4GL keyword
new Keyword("tabs" , 0, KW_TABS , false), // FWD extension, not a real 4GL keyword
new Keyword("tabs-show" , 0, KW_TAB_SHOW, false), // FWD extension, not a real 4GL keyword
new Keyword("tab-index" , 0, KW_TAB_IDX , false), // FWD extension, not a real 4GL keyword
new Keyword("tab-position" , 0, KW_TAB_POS , false),
new Keyword("tab-stop" , 0, KW_TAB_STOP, false),
new Keyword("table" , 0, KW_TABLE , true ),
new Keyword("table-crc-list" , 0, KW_TAB_CRCL, false), // missing from keyword index and UNTESTED at this time
new Keyword("table-list" , 0, KW_TAB_LIST, false), // missing from keyword index and UNTESTED at this time
new Keyword("table-handle" , 0, KW_TAB_HAND, false),
new Keyword("table-number" , 0, KW_TAB_NUM , true ),
new Keyword("table-scan" , 0, KW_TAB_SCAN, false),
new Keyword("tabset" , 0, KW_TABSET , false), // FWD extension, not a real 4GL keyword
new Keyword("tag" , 0, KW_TAG , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("target" , 0, KW_TARGET , false),
new Keyword("target-procedure" , 0, KW_TAR_PROC, false),
new Keyword("temp-directory" , 8, KW_TEMP_DIR, false),
new Keyword("temp-table" , 0, KW_TEMP_TAB, false),
new Keyword("temp-table-prepare" , 0, KW_TT_PREP , false),
new Keyword("tenant-id" , 0, KW_TEN_ID, false), // missing in keyword index, found in customer code
new Keyword("tenant-name" , 0, KW_TENNAME, false), // missing in keyword index, found in customer code
new Keyword("tenant-name-to-id" , 0, KW_TN_TOID, false), // missing in keyword index, found in customer code
new Keyword("term" , 0, KW_TERM , true ), // non-abbreviated synonym for TERMINAL
new Keyword("terminal" , 0, KW_TERM , true ), // the keyword index incorrectly states that TERMINAL can be abbreviatated down to a minimum TERM, this is not correct, there is no abbreviation possible (just the synonym TERM)
new Keyword("terminate" , 0, KW_TERMINAT, false),
new Keyword("termination-hook" , 0, KW_TERM_HK , false), // FWD extension, not a real 4GL keyword
new Keyword("text" , 0, KW_TEXT , true ),
new Keyword("text-cursor" , 0, KW_TXT_CURS, true ),
new Keyword("text-seg-grow" , 0, KW_TXT_SEG , false),
new Keyword("text-selected" , 0, KW_TXT_SEL , false),
new Keyword("text-edit" , 0, KW_TEXTEDIT, false ), // FWD extension, not a real 4GL keyword
new Keyword("then" , 0, KW_THEN , true ),
new Keyword("this-object" , 0, KW_THIS_OBJ, true ),
new Keyword("this-procedure" , 0, KW_THIS_PRC, true ),
new Keyword("thousand-separator" , 0, KW_THO_SEP , false), // FWD extension, not a real 4GL keyword
new Keyword("thread-safe" , 0, KW_THR_SAFE, false),
new Keyword("three-d" , 0, KW_3D , false),
new Keyword("thru" , 0, KW_THROUGH , false),
new Keyword("through" , 0, KW_THROUGH , false),
new Keyword("throw" , 0, KW_THROW , false),
new Keyword("tic-marks" , 0, KW_TIC_MARK, false),
new Keyword("time" , 0, KW_TIME , true ),
new Keyword("timer" , 0, KW_TIMER , false), // FWD TIMER extension
new Keyword("timezone" , 0, KW_TIMEZONE, false), // missing from keyword index and UNTESTED at this time
new Keyword("time-source" , 0, KW_TIME_SRC, false),
new Keyword("title" , 0, KW_TITLE , true ),
new Keyword("title-bgcolor" , 9, KW_TITL_BGC, false),
new Keyword("title-dcolor" , 8, KW_TITL_DC , false),
new Keyword("title-fgcolor" , 9, KW_TITL_FGC, false),
new Keyword("title-font" , 8, KW_TITL_FON, false),
new Keyword("to" , 0, KW_TO , true ),
new Keyword("today" , 0, KW_TODAY , false),
new Keyword("toggle-box" , 0, KW_TOGGL_BX, false),
new Keyword("tooltip" , 0, KW_TOOLTIP , false),
new Keyword("tooltips" , 0, KW_TOOLTIPS, false),
new Keyword("top" , 0, KW_TOP , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("top-column" , 0, KW_TOP_COL , false), // missing in keyword index, found in prog handbook as a key function
new Keyword("top-nav-query" , 0, KW_TOP_NAVQ, false),
new Keyword("top-only" , 0, KW_TOP_ONLY, true ),
new Keyword("topic" , 0, KW_TOPIC , false),
new Keyword("total" , 0, KW_TOTAL , false),
new Keyword("to-rowid" , 0, KW_TO_ROWID, true ),
new Keyword("trace-filter" , 0, KW_TRC_FILT, false), // missing from keyword index, found in customer code and UNTESTED at this time
new Keyword("tracing" , 0, KW_TRACING, false), // missing in keyword index, found in customer code
new Keyword("tracking-changes" , 0, KW_TRAC_CHG, false),
new Keyword("trailing" , 0, KW_TRAILING, false),
new Keyword("trans-init-procedure" , 0, KW_TRAN_I_P, false),
new Keyword("trans" , 0, KW_TRANS , true ), // undocumented feature transa and transac are unreserved (just symbols) so we exclude them here by using 2 keyword defs to leave a loophole like in the 4GL
new Keyword("transaction" , 8, KW_TRANS , true ),
new Keyword("transaction-mode" , 0, KW_TRAN_MOD, false),
new Keyword("transparent" , 0, KW_TRANSPAR, false),
new Keyword("tree-node-value" , 0, KW_TNOD_VAL, false), // FWD extension, not a real 4GL keyword
new Keyword("tree-row-height" , 0, KW_TREE_R_H, false), // FWD extension, not a real 4GL keyword
new Keyword("treelist" , 0, KW_TREELIST, false), // FWD extension, not a real 4GL keyword
new Keyword("treeview" , 0, KW_TREEVIEW, false), // FWD extension, not a real 4GL keyword
new Keyword("trigger" , 0, KW_TRIGGER , true ),
new Keyword("trigger-node" , 0, KW_TRIG_NOD, true ), // FWD extension, not a real 4GL keyword
new Keyword("trigger-column" , 0, KW_TRIG_COL, true ), // FWD extension, not a real 4GL keyword
new Keyword("triggers" , 0, KW_TRIGGERS, true ),
new Keyword("trim" , 0, KW_TRIM , true ),
new Keyword("truncate" , 5, KW_TRUNC , false),
new Keyword("true" , 0, BOOL_TRUE , true ),
new Keyword("ttcodepage" , 0, KW_TTCP , false), // missing from keyword index and UNTESTED at this time
new Keyword("type" , 0, KW_TYPE , false),
new Keyword("type-of" , 0, KW_TYPE_OF , false),
new Keyword("titlebackcolor" , 0, KW_CALTITBG, false), // CALENDAR:TitleBackColor
new Keyword("titleforecolor" , 0, KW_CALTITFG, false), // CALENDAR:TitleForeColor
new Keyword("trailingforecolor" , 0, KW_CALTRLFG, false), // CALENDAR:TrailingForeColor
new Keyword("unbox" , 6, KW_UNBOX , false),
new Keyword("unbuffered" , 6, KW_UNBUF , false),
new Keyword("undo" , 0, KW_UNDO , true ),
new Keyword("undo-throw-scope" , 0, KW_UNDO_T_S, false ), // missing from keyword index and UNTESTED at this time
new Keyword("unique" , 0, KW_UNIQUE , true ),
new Keyword("unix" , 0, KW_UNIX , true ),
new Keyword("unix-end" , 0, KW_UNIX_END, false), // missing in keyword index, found in prog handbook as a key function
new Keyword("unless-hidden" , 0, KW_UNL_HID , false),
new Keyword("unload" , 0, KW_UNLOAD , false),
new Keyword("underline" , 6, KW_UNDERLIN, true ),
new Keyword("unformatted" , 6, KW_UNFORMAT, true ),
new Keyword("union" , 0, KW_UNION , true ),
new Keyword("unique-id" , 0, KW_UNIQ_ID , false),
new Keyword("unique-key" , 0, KW_UNIQ_KEY, false), // FWD extension, not a real 4GL keyword. Unique browse key.
new Keyword("unique-match" , 0, KW_UNIQ_MAT, false),
new Keyword("unsigned-byte" , 0, KW_UNS_BYTE, false), // missing in keyword index, found elsewhere in external program interface ref
new Keyword("unsigned-short" , 0, KW_UNS_SHRT, false), // missing in keyword index, found elsewhere in lang ref
new Keyword("unsigned-long" , 0, KW_UNS_LONG, false),
new Keyword("unsubscribe" , 0, KW_UNSUBSCR, true), // keyword index lists this as unreserved, which is incorrect
new Keyword("up" , 0, KW_UP , true ),
new Keyword("update" , 0, KW_UPDATE , true ),
new Keyword("update-attribute" , 0, KW_UPD_ATTR, false),
new Keyword("updown" , 0, KW_CALUPDWN, false), // FWD extension, CALENDAR:UpDown, not a real 4GL keyword
new Keyword("upload" , 0, KW_UPLOAD , false), // FWD extension, not a real 4GL keyword
new Keyword("url" , 0, KW_URL , false),
new Keyword("urldecode" , 0, KW_URL_DECO, false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("url-decode" , 0, KW_URL_DECO, false),
new Keyword("urlencode" , 0, KW_URL_ENCO, false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("url-encode" , 0, KW_URL_ENCO, false),
new Keyword("url-field" , 0, KW_URL_FLD , false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("url-field-list" , 0, KW_URL_FLDL, false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("url-format" , 0, KW_URL_FMT , false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("url-password" , 0, KW_URL_PW , false),
new Keyword("url-userid" , 0, KW_URL_UID , false),
new Keyword("user" , 0, KW_USERID , true ),
new Keyword("userid" , 0, KW_USERID , true ),
new Keyword("user-id" , 0, KW_USER_ID , false),
new Keyword("user-data" , 0, KW_USR_DATA, false), // missing in keyword reference, found in customer code
new Keyword("use" , 0, KW_USE , false),
new Keyword("use-dict-exps" , 0, KW_USE_DCT , false),
new Keyword("use-filename" , 0, KW_USE_FIL , false),
new Keyword("use-index" , 0, KW_USE_IDX , true ),
new Keyword("use-revvideo" , 0, KW_USE_REV , false),
new Keyword("use-text" , 0, KW_USE_TXT , false),
new Keyword("use-underline" , 0, KW_USE_UND , false),
new Keyword("use-widget-pool" , 0, KW_USE_WIDP, false),
new Keyword("user-agent" , 0, KW_BR_AGENT, false), // FWD extension, not a real 4GL keyword
new Keyword("using" , 0, KW_USING , true ),
new Keyword("utc-offset" , 0, KW_UTC_OFF , false),
new Keyword("v-scroll-position" , 0, KW_V_SCRL_P, false), // FWD extension, not a real 4GL keyword
new Keyword("v6display" , 0, KW_V6DISP , false),
new Keyword("v6frame" , 0, KW_V6FRAME , true ),
new Keyword("validate-expression" , 0, KW_VAL_EXPR, false),
new Keyword("validate-message" , 0, KW_VAL_MSG , false),
new Keyword("validate-seal" , 0, KW_VAL_SEAL, false),
new Keyword("validate-xml" , 0, KW_VAL_XML , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("validate" , 0, KW_VALIDATE, false),
new Keyword("validation-enabled" , 0, KW_VAL_ENAB, false),
new Keyword("valid-event" , 0, KW_VAL_EVT , false),
new Keyword("valid-handle" , 0, KW_VAL_HND , false),
new Keyword("valid-object" , 0, KW_VAL_OBJ , false),
new Keyword("value" , 0, KW_VALUE , true ),
new Keyword("value-changed" , 0, KW_VAL_CHG , true ),
new Keyword("values" , 0, KW_VALUES , true ),
new Keyword("variable" , 3, KW_VAR , false),
new Keyword("verbose" , 0, KW_VERBOSE , false),
new Keyword("vertical" , 4, KW_VERT , false),
new Keyword("version" , 0, KW_VERSION , false),
new Keyword("view" , 0, KW_VIEW , true ),
new Keyword("view-as" , 0, KW_VIEW_AS , true ),
new Keyword("view-first-column-on-reopen" , 0, KW_VIEW_FCR, false),
new Keyword("visible" , 0, KW_VISIBLE , false),
new Keyword("visible-node-count" , 0, KW_V_N_CNT , false), // FWD extension, not a real 4GL keyword
new Keyword("visible-row-count" , 0, KW_V_R_CNT , false), // FWD extension, not a real 4GL keyword
new Keyword("virtual-height-chars" , 14, KW_VIRT_HC , false),
new Keyword("virtual-height-pixels" , 16, KW_VIRT_HP , false),
new Keyword("virtual-width-chars" , 13, KW_VIRT_WC , false),
new Keyword("virtual-width-pixels" , 15, KW_VIRT_WP , false),
new Keyword("vms" , 0, KW_VMS , true ), // undocumented
new Keyword("void" , 0, KW_VOID , false),
new Keyword("wait" , 0, KW_WAIT , false), // non-abbreviated synonym for WAIT-FOR
new Keyword("wait-for" , 0, KW_WAIT_FOR, true ),
new Keyword("warning" , 0, KW_WARN , false),
new Keyword("wc-admin-app" , 0, KW_WC_AD_AP, false), // missing from keyword index and UNTESTED at this time
new Keyword("web" , 0, KW_WEB , false), // missing in keyword index, found in WebSpeed reference
new Keyword("web-context" , 0, KW_WEB_CTX , false),
new Keyword("web-file-upload" , 0, KW_WEB_FUP , false), // FWD extension, not a real 4GL keyword
new Keyword("web-upload-error" , 0, KW_WUPL_ERR, false), // FWD extension, not a real 4GL keyword
new Keyword("web-upload-files" , 0, KW_WUPL_FLS, false), // FWD extension, not a real 4GL keyword
new Keyword("web.output" , 0, KW_WEB_OUT , false), // not a real keyword, but is normally defined in the PSC webspeed 4GL code
new Keyword("weekday" , 0, KW_WEEK , false),
new Keyword("when" , 0, KW_WHEN , true ),
new Keyword("where" , 0, KW_WHERE , true ),
new Keyword("where-string" , 0, KW_WHERE_ST, false), // missing from keyword index and UNTESTED at this time
new Keyword("while" , 0, KW_WHILE , true ),
new Keyword("widget" , 0, KW_WIDGET , false),
new Keyword("widget-enter" , 8, KW_WID_ENT , false),
new Keyword("widget-handle" , 8, KW_WID_HAND, false),
new Keyword("widget-id" , 0, KW_WID_ID , false),
new Keyword("widget-leave" , 8, KW_WID_LEAV, false),
new Keyword("widget-pool" , 0, KW_WID_POOL, false),
new Keyword("width" , 0, KW_WIDTH , false),
new Keyword("width-chars" , 6, KW_WIDTH_C , false),
new Keyword("width-pixels" , 7, KW_WIDTH_P , false),
new Keyword("window" , 0, KW_WINDOW , true ),
new Keyword("window-close" , 0, KW_WIN_CLOS, false), // missing in keyword index, found elsewhere in lang ref
new Keyword("window-delayed-minimize" , 17, KW_WIN_DMIN, true ), // missing in keyword index, found elsewhere in lang ref
new Keyword("window-maximized" , 12, KW_WIN_MAX , true ),
new Keyword("window-minimized" , 12, KW_WIN_MIN , true ),
new Keyword("window-name" , 0, KW_WIN_NAME, false),
new Keyword("window-normal" , 0, KW_WIN_NORM, true ),
new Keyword("window-resized" , 0, KW_WIN_RESI, false), // missing in keyword index, found elsewhere in lang ref
new Keyword("window-restored" , 0, KW_WIN_REST, false), // missing in keyword index, found elsewhere in lang ref
new Keyword("window-state" , 10, KW_WIN_STAT, false),
new Keyword("window-system" , 0, KW_WIN_SYS , false),
new Keyword("with" , 0, KW_WITH , true ),
new Keyword("word-index" , 0, KW_WORD_IDX, false),
new Keyword("word-wrap" , 0, KW_WORD_WRP, false),
new Keyword("work-area-height-pixels" , 0, KW_WA_H_P , false),
new Keyword("work-area-width-pixels" , 0, KW_WA_W_P , false),
new Keyword("work-area-x" , 0, KW_WA_X , false),
new Keyword("work-area-y" , 0, KW_WA_Y , false),
new Keyword("workfile" , 0, KW_WORK_TAB, true ),
new Keyword("work-table" , 8, KW_WORK_TAB, true ),
new Keyword("write" , 0, KW_WRITE , true ),
new Keyword("write-cdata" , 0, KW_WR_CDATA, false),
new Keyword("write-characters" , 0, KW_WR_CHARS, false),
new Keyword("write-comment" , 0, KW_WR_CMNT , false),
new Keyword("write-data" , 0, KW_WR_DATA, false), // missing in keyword reference, found in customer code
new Keyword("write-data-element" , 0, KW_WR_D_ELM, false),
new Keyword("write-empty-element" , 0, KW_WR_E_ELM, false),
new Keyword("write-entity-ref" , 0, KW_WR_ENT_R, false),
new Keyword("write-external-dtd" , 0, KW_WR_EXDTD, false),
new Keyword("write-fragment" , 0, KW_WR_FRAGM, false),
new Keyword("write-json" , 0, KW_WR_JSON , false),
new Keyword("write-message" , 0, KW_WR_MSG , false),
new Keyword("write-processing-instruction" , 0, KW_WR_PRINS, false),
new Keyword("write-status" , 0, KW_WR_STAT , false),
new Keyword("write-xml" , 0, KW_WR_XML , false),
new Keyword("write-xmlschema" , 0, KW_WR_XMLSC, false),
new Keyword("x" , 0, KW_X , false),
new Keyword("xcode" , 0, KW_XCODE , true ),
new Keyword("xml-data-type" , 0, KW_XML_DTYP, false),
new Keyword("xml-entity-expansion-limit" , 0, KW_XML_E_EL, false),
new Keyword("xml-node-name" , 0, KW_XML_NNAM, false), // missing in keyword index, found elsewhere in lang ref, TESTED
new Keyword("xml-node-type" , 0, KW_XML_NTYP, false),
new Keyword("xml-schema-path" , 0, KW_XML_SCHP, false),
new Keyword("xml-strict-entity-resolution" , 0, KW_XML_S_ER, false),
new Keyword("xml-suppress-namespace-processing",0, KW_XML_SNSP, false),
new Keyword("xpr-to-pdf" , 0, KW_XPR2PDF , false), // FWD extension, not real 4GL!
new Keyword("xor" , 0, KW_XOR , true ), // missing in keyword index, found elsewhere in lang ref, tested to confirm it is reserved
new Keyword("xref" , 0, KW_XREF , true ),
new Keyword("xref-xml" , 0, KW_XREF_XML, true ),
new Keyword("x-document" , 0, KW_X_DOC , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("x-noderef" , 0, KW_X_NODE , false), // missing in keyword index, found elsewhere in lang ref
new Keyword("x-of" , 0, KW_X_OF , false),
new Keyword("year" , 0, KW_YEAR , false),
new Keyword("year-offset" , 0, KW_YEAR_OFF, false),
new Keyword("yes" , 0, BOOL_TRUE , true ),
new Keyword("yes-no" , 0, KW_YES_NO , false),
new Keyword("yes-no-cancel" , 0, KW_YES_NO_C, false),
new Keyword("y" , 0, KW_Y , false),
new Keyword("y-of" , 0, KW_Y_OF , false)
};
}
/**
* Constructs a lexer using a reader as input and associating a
* <code>SymbolResolver</code> with the instance. The reader will be
* wrapped in a {@link DotKludgeReader} instance.
*
* @param in
* The reader representing the Progress 4GL source code.
* @param sr
* Provides keyword dictionary storage and lookup for symbol
* resolution in the lexer.
*/
public ProgressLexer(Reader in, SymbolResolver sr)
{
this(in, sr, true);
}
/**
* Constructs a lexer using a reader as input and associating a
* <code>SymbolResolver</code> with the instance.
*
* @param in
* The reader representing the Progress 4GL source code.
* @param sr
* Provides keyword dictionary storage and lookup for symbol
* resolution in the lexer.
* @param kludge
* <code>true</code> to force the reader to be wrapped in a
* {@link DotKludgeReader} instance.
*/
public ProgressLexer(Reader in, SymbolResolver sr, boolean kludge)
{
this(new CharBuffer(kludge ? new DotKludgeReader(in) : in));
sym = sr;
initializeKeywordDictionary();
readCfg();
}
/**
* Constructs a lexer using stream as input and associating a
* <code>SymbolResolver</code> with the instance. The stream will be
* wrapped in a {@link DotKludgeStream} instance.
*
* @param in
* The stream representing the Progress 4GL source code.
* @param sr
* Provides keyword dictionary storage and lookup for symbol
* resolution in the lexer.
*/
public ProgressLexer(InputStream in, SymbolResolver sr)
{
this(in, sr, true);
}
/**
* Constructs a lexer using stream as input and associating a
* <code>SymbolResolver</code> with the instance.
*
* @param in
* The stream representing the Progress 4GL source code.
* @param sr
* Provides keyword dictionary storage and lookup for symbol
* resolution in the lexer.
* @param kludge
* <code>true</code> to force the stream to be wrapped in a
* {@link DotKludgeStream} instance.
*/
public ProgressLexer(InputStream in, SymbolResolver sr, boolean kludge)
{
this(new ByteBuffer(kludge ? new DotKludgeStream(in) : in));
sym = sr;
initializeKeywordDictionary();
readCfg();
}
/**
* Initialize configuration values.
*/
public void readCfg()
{
allowSlashSlash = Configuration.getParameter("allow-slash-slash", true);
unixEscapes = Configuration.getParameter("unix-escapes", true);
}
/**
* Get the keyword list.
*
* @return The list of all recognized keywords.
*/
public static Keyword[] getKeywords()
{
return keywords;
}
/**
* Get the keyword ignore list.
*
* @return The list of all ignored keywords.
*/
public static Keyword[] getIgnoredKeywords()
{
return ignored;
}
/**
* Remove each of the given keywords from the keyword dictionary. This
* matches the behavior of the Progress "keyword forget" list (the -k
* parameter on startup).
*
* @param names
* Keywords to remove.
*/
public void ignoreKeywords(String[] names)
{
ArrayList<Keyword> list = new ArrayList<Keyword>();
for (int i = 0; i < names.length; i++)
{
Keyword found = sym.lookupKeyword(names[i]);
if (found != null)
{
list.add(found);
sym.removeKeyword(found);
}
else
{
String err = String.format("Cannot ignore unknown keyword '%s'.",
names[i]);
// TODO: log this?
System.out.println(err);
}
}
if (!list.isEmpty())
{
ignored = list.toArray(new Keyword[0]);
}
}
/**
* Reports on the state of debug in the lexer.
*
* @return Debug state.
*/
public boolean isDebug()
{
return debug;
}
/**
* Sets the state of debug in the lexer.
*
* @param dbg
* Debug state.
*/
public void setDebug( boolean dbg )
{
debug = dbg;
}
/**
* Reports on whether schema-specific processing is activated in the lexer.
*
* @return Schema-specific processing activation state.
*/
public boolean isSchema()
{
return schema;
}
/**
* Activates schema-specific processing in the lexer. At this time the
* only difference in output is in the recognized keywords. This is a
* 'one way' state change and cannot be reversed!
*/
public void activateSchemaProcessing()
{
schema = true;
initializeSchemaKeywords();
}
/**
* Reports on whether export-specific processing is activated in the lexer.
*
* @return Export-specific processing activation state.
*/
public boolean isExport()
{
return export;
}
/**
* Activates export-specific processing in the lexer. This is used
* specifically by semantic predicate logic in the lexer DSTRING rule
* to handle export mode-specific processing which differs from the
* standard string rules. This is a 'one way' state change and cannot
* be reversed!
*/
public void activateExportMode()
{
export = true;
}
/**
* Reports on whether hidden stream processing is activated in the lexer.
*
* @return Hidden stream processing activation state.
*/
public boolean isHidden()
{
return hidden;
}
/**
* Activates hidden stream processing in the lexer. This sets the returned
* token class to <code>TokenStreamHiddenTokenFilter</code> and disables
* the lexer's normal 'skip' processing of certain token types.
* This is a 'one way' state change and cannot be reversed!
*/
public void activateHiddenProcessing()
{
hidden = true;
setTokenObjectClass("com.goldencode.ast.ManagedHiddenStreamToken");
}
/**
* Turns on/off raw string processing mode. The mode may be changed an
* arbitrary number of times.
*
* @param raw
* Raw processing mode: <code>true</code> to turn on,
* <code>false</code> to turn off.
*/
public void setRaw(boolean raw)
{
this.raw = raw;
}
/**
* Reports on whether the lexer is currently in raw string processing
* mode.
*
* @return <code>true</code> if in raw string mode, else
* <code>false</code>.
*/
public boolean isRaw()
{
return raw;
}
/**
* Sets whether the lexer is currently honoring the backslash as
* an escape character.
*
* @param unixEscapes
* <code>true</code> if in UNIX escape mode, else
* <code>false</code>.
*/
public void setUnixEscapes(boolean unixEscapes)
{
this.unixEscapes = unixEscapes;
}
/**
* Reports on whether the lexer is currently honoring the backslash as
* an escape character.
*
* @return <code>true</code> if in UNIX escape mode, else
* <code>false</code>.
*/
public boolean isUnixEscapes()
{
return unixEscapes;
}
/**
* Allow this instance to cleanup any resources that were allocated.
*/
public void close()
{
// nothing to do
}
/**
* Process the keyword array to add each <code>Keyword</code> into the
* keyword dictionary. This method is called during construction so that
* all lexer processing can have keyword lookup facilities available
* from the first token. The keyword array is a static member initialized
* during class load.
*/
private void initializeKeywordDictionary()
{
if (sym.isRuntimeConfig())
{
// already initialized from an exemplar
return;
}
for (int i = 0; i < keywords.length; i++)
{
sym.addKeyword(keywords[i]);
}
}
/**
* Creates a <code>Keyword</code> array and initializes that array to
* a the list of all Progress schema-specific keywords. The
* initialization is done in-line and the source file is organized in
* an easy to maintain column format. A loop then processes this array
* and adds each <code>Keyword</code> into the keyword dictionary. This
* method is called during construction so that all lexer processing can
* have keyword lookup facilities available from the first token.
* <p>
* The following values are needed for each <code>Keyword</code> object:
* <ul>
* <li> full keyword text for the keyword
* <li> the minimum number of characters for matching (abbreviations
* will always be disabled so this value is set to 0)
* <li> the integer token type to assign to the keyword on a match
* (see below)
* <li> whether it is a reserved keyword or not (these keywords are
* never reserved so this value is always <code>false</code>)
* </ul>
* <p>
* See <code>{@link Keyword}</code> for more details.
* <p>
* The core idea here is to populate a facility where the symbol text (in
* the mSYMBOL method) can be submitted to the keyword dictionary for a
* lookup. If a match is found, then the token type of the token is set
* based on the token type field in the <code>Keyword</code> object
* found in the dictionary. This returned token type will override the
* default token type of <code>SYMBOL</code>. Since all of these keywords
* are not encoded in the matching rules of the grammar itself, there are
* no actual token definitions in the lexer that match these keywords.
* For this reason, we take advantage of the feature in the parser in
* which we can create (reserve) a unique integer value and associate it
* with a specific artificial token name (e.g. KW_DEFINE). These
* artificial token types are used as the values when constructing
* <code>Keyword</code> objects.
* <p>
* When adding <code>Keyword</code> objects to this array, make sure to
* add the associated artificial token type to the tokens { } section
* of the parser.
*/
private void initializeSchemaKeywords()
{
Keyword[] schemaKeywords =
{
/* format: Full Keyword Text , Abr, Token Type , Reserved */
new Keyword("abbreviated" , 0, KW_ABBV , false),
new Keyword("area" , 0, KW_AREA , false),
new Keyword("bigint" , 0, KW_BIGINT , false),
new Keyword("buffer-pool" , 0, KW_BUFRPOOL , false),
new Keyword("bufpool" , 0, KW_BUFPOOL , false),
new Keyword("category" , 0, KW_CATEGORY , false),
new Keyword("clob-codepage" , 0, KW_CLOB_CP , false),
new Keyword("clob-collation" , 0, KW_CLOB_COL , false),
new Keyword("clob-type" , 0, KW_CLOB_TYP , false),
new Keyword("column-label-sa" , 0, KW_COL_L_SA , false),
new Keyword("crc" , 0, KW_CRC , false),
new Keyword("cycle-on-limit" , 0, KW_CYCLE , false),
new Keyword("dump-name" , 0, KW_DMP_NAME , false),
new Keyword("field-trigger" , 0, KW_FLD_TRG , false),
new Keyword("fixchar" , 0, KW_FIXCHAR , false),
new Keyword("format-sa" , 0, KW_FMT_SA , false),
new Keyword("frozen" , 0, KW_FROZEN , false),
new Keyword("help-sa" , 0, KW_HELP_SA , false),
new Keyword("index-field" , 0, KW_IDX_FLD , false),
new Keyword("inactive" , 0, KW_INACTIVE , false),
new Keyword("increment" , 0, KW_INCR , false),
new Keyword("initial-sa" , 0, KW_INIT_SA , false),
new Keyword("label-sa" , 0, KW_LABEL_SA , false),
new Keyword("lob-area" , 0, KW_LOB_AREA , false),
new Keyword("lob-bytes" , 0, KW_LOB_BYTE , false),
new Keyword("lob-size" , 0, KW_LOB_SIZE , false),
new Keyword("multitenant" , 0, KW_MULTI_TN , false),
new Keyword("no-default-area" , 0, KW_NO_DEFAR , false),
new Keyword("no-override" , 0, KW_NO_OVRRD , false),
new Keyword("not-case-sensitive", 0, KW_NOT_CS , false),
new Keyword("null-allowed" , 0, KW_NULLALWD , false),
new Keyword("psc" , 0, KW_PSC , false),
new Keyword("sequence" , 0, KW_SEQUENCE , false),
new Keyword("sql-width" , 0, KW_SQL_WID , false),
new Keyword("table-trigger" , 0, KW_TAB_TRG , false),
new Keyword("timestamp" , 0, KW_TIMESTMP , false),
new Keyword("word" , 0, KW_WORD_IDX , false),
new Keyword("valexp" , 0, KW_VALEXP , false),
new Keyword("valmsg" , 0, KW_VALMSG , false),
new Keyword("valmsg-sa" , 0, KW_VALMG_SA , false)
};
for (int i = 0; i < schemaKeywords.length; i++)
{
sym.addKeyword(schemaKeywords[i]);
}
}
/**
* Provides a command line interface for an end user to drive and/or test
* the ProgressLexer class.
* <p>
* Syntax:
* <pre>
* java ProgressLexer <Progress_4GL_source_file>
* </pre>
* Where:
* <ul>
* <li> <Progress_4GL_source_filename> is the filename of a
* preprocessed Progress 4GL source file (enclose the name in
* double quotes if spaces or other reserved command line
* characters are part of the filename)
* </ul>
*
* @param args
* List of command line arguments.
*/
public static void main(String[] args)
{
String syntax = "Syntax: java ProgressLexer <Progress_4GL_source_file>";
if (args.length != 1)
{
LOG.log(Level.SEVERE, syntax);
System.exit(-1);
}
try
{
// setup
SymbolResolver sym = new SymbolResolver(true);
FileReader fr = new FileReader(args[0]);
BufferedReader br = new BufferedReader(fr);
LexerDumpFilter test = new LexerDumpFilter(br, sym);
test.setOutput(new PrintWriter(System.out));
test.activateHiddenProcessing();
test.setBypassSkip(true);
// start the lexing and print a record for each token
test.dump();
}
catch (Exception excpt)
{
LOG.log(Level.SEVERE, "", excpt);
}
}
public ProgressLexer(InputStream in) {
this(new ByteBuffer(in));
}
public ProgressLexer(Reader in) {
this(new CharBuffer(in));
}
public ProgressLexer(InputBuffer ib) {
this(new LexerSharedInputState(ib));
}
public ProgressLexer(LexerSharedInputState state) {
super(state);
caseSensitiveLiterals = false;
setCaseSensitive(false);
literals = new Hashtable();
}
public Token nextToken() throws TokenStreamException {
Token theRetToken=null;
tryAgain:
for (;;) {
Token _token = null;
int _ttype = Token.INVALID_TYPE;
resetText();
try { // for char stream error handling
try { // for lexical error handling
switch ( LA(1)) {
case '\u0000': case '\u0001': case '\u0002': case '\u0003':
case '\u0004': case '\u0005': case '\u0006': case '\u0007':
case '\u0008': case '\t': case '\n': case '\u000b':
case '\u000c': case '\r': case '\u000e': case '\u000f':
case '\u0010': case '\u0011': case '\u0012': case '\u0013':
case '\u0014': case '\u0015': case '\u0016': case '\u0017':
case '\u0018': case '\u0019': case '\u001a': case '\u001b':
case '\u001c': case '\u001d': case '\u001e': case '\u001f':
case ' ': case '\u007f':
{
mWS(true);
theRetToken=_returnToken;
break;
}
case '~':
{
mTILDE(true);
theRetToken=_returnToken;
break;
}
case '"': case '\'':
{
mSTRING(true);
theRetToken=_returnToken;
break;
}
case ',':
{
mCOMMA(true);
theRetToken=_returnToken;
break;
}
case '=':
{
mEQUALS(true);
theRetToken=_returnToken;
break;
}
case '(':
{
mLPARENS(true);
theRetToken=_returnToken;
break;
}
case ')':
{
mRPARENS(true);
theRetToken=_returnToken;
break;
}
case '[':
{
mLBRACKET(true);
theRetToken=_returnToken;
break;
}
case ']':
{
mRBRACKET(true);
theRetToken=_returnToken;
break;
}
case '@':
{
mAT(true);
theRetToken=_returnToken;
break;
}
case '^':
{
mCARET(true);
theRetToken=_returnToken;
break;
}
case '?':
{
mUNKNOWN_VAL(true);
theRetToken=_returnToken;
break;
}
default:
if ((LA(1)=='/') && (LA(2)=='*')) {
mCOMMENT(true);
theRetToken=_returnToken;
}
else if ((LA(1)==':') && (LA(2)==':')) {
mDB_REF_NON_STATIC(true);
theRetToken=_returnToken;
}
else if ((LA(1)=='*') && (LA(2)=='=')) {
mMULT_ASSIGN(true);
theRetToken=_returnToken;
}
else if ((LA(1)=='+') && (LA(2)=='=')) {
mPLUS_ASSIGN(true);
theRetToken=_returnToken;
}
else if ((LA(1)=='-') && (LA(2)=='=')) {
mMINUS_ASSIGN(true);
theRetToken=_returnToken;
}
else if ((LA(1)=='/') && (LA(2)=='=')) {
mDIV_ASSIGN(true);
theRetToken=_returnToken;
}
else if ((LA(1)=='<') && (LA(2)=='>')) {
mNOT_EQ(true);
theRetToken=_returnToken;
}
else if ((LA(1)=='>') && (LA(2)=='=')) {
mGTE(true);
theRetToken=_returnToken;
}
else if ((LA(1)=='<') && (LA(2)=='=')) {
mLTE(true);
theRetToken=_returnToken;
}
else if ((_tokenSet_0.member(LA(1))) && (true)) {
mSYMBOL(true);
theRetToken=_returnToken;
}
else if ((LA(1)==':') && (true)) {
mCOLON(true);
theRetToken=_returnToken;
}
else if ((LA(1)=='>') && (true)) {
mGT(true);
theRetToken=_returnToken;
}
else if ((LA(1)=='<') && (true)) {
mLT(true);
theRetToken=_returnToken;
}
else if ((LA(1)=='*') && (true)) {
mMULTIPLY(true);
theRetToken=_returnToken;
}
else if ((_tokenSet_1.member(LA(1))) && (true)) {
mNUM_LITERAL(true);
theRetToken=_returnToken;
}
else if ((_tokenSet_2.member(LA(1)))) {
mUNKNOWN_TOKEN(true);
theRetToken=_returnToken;
}
else {
if (LA(1)==EOF_CHAR) {uponEOF(); _returnToken = makeToken(Token.EOF_TYPE);}
else {throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());}
}
}
if ( _returnToken==null ) continue tryAgain; // found SKIP token
_ttype = _returnToken.getType();
_returnToken.setType(_ttype);
return _returnToken;
}
catch (RecognitionException e) {
throw new TokenStreamRecognitionException(e);
}
}
catch (CharStreamException cse) {
if ( cse instanceof CharStreamIOException ) {
throw new TokenStreamIOException(((CharStreamIOException)cse).io);
}
else {
throw new TokenStreamException(cse.getMessage());
}
}
}
}
/**
* Matches any amount of whitespace in a program and sets the token type to
* "skip". In addition, each newline character causes the lexer's
* line counter to be incremented in order to properly maintain each token's
* line information.
* <p>
* Spaces, tabs and carriage returns and line feeds (newlines) are all
* matched. Although the preprocessor generally removes carriage returns,
* if the input file was to include a ~015 (escaped carriage return), it
* would be placed in the output file. For safety, we must leave the
* carriage return processing in this rule to ensure that any such matches
* can be consumed as whitespace. Normally such escaped carriage returns
* would only be found inside strings, but in complex preprocessor
* replacements, it is very possible that a coding error could leave such
* characters outside a string in some cases. Progress 4GL is tolerant of
* such escaped carriage returns and thus our whitespace rule must also
* handle this condition.
* <p>
* Non-visible ASCII codes decimal 127 and below are matched here as well.
* <p>
* This is a top level lexer rule which means that there is an associated
* <code>WS</code> token.
* <p>
* If the {@link #activateHiddenProcessing} is called, then tokens generated
* using this rule will not be skipped, but instead will flow through to
* the caller.
*/
public final void mWS(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
int _ttype; Token _token=null; int _begin=text.length();
_ttype = WS;
int _saveIndex;
{
int _cnt1830=0;
_loop1830:
do {
switch ( LA(1)) {
case ' ':
{
match(' ');
break;
}
case '\t':
{
match('\t');
break;
}
case '\r':
{
match('\r');
break;
}
case '\n':
{
match('\n');
newline();
break;
}
case '\u0000': case '\u0001': case '\u0002': case '\u0003':
case '\u0004': case '\u0005': case '\u0006': case '\u0007':
case '\u0008': case '\u000b': case '\u000c': case '\u000e':
case '\u000f': case '\u0010': case '\u0011': case '\u0012':
case '\u0013': case '\u0014': case '\u0015': case '\u0016':
case '\u0017': case '\u0018': case '\u0019': case '\u001a':
case '\u001b': case '\u001c': case '\u001d': case '\u001e':
case '\u001f': case '\u007f':
{
mJUNK(false);
break;
}
default:
{
if ( _cnt1830>=1 ) { break _loop1830; } else {throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());}
}
}
_cnt1830++;
} while (true);
}
if (!hidden) _ttype = Token.SKIP;
if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
_token = makeToken(_ttype);
_token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
}
_returnToken = _token;
}
/**
* Matches non-visible ASCII codes that should be silently ignored. Extended
* ASCII characters are NOT matched here. This is text that should not appear
* in 4GL outside of a string or comment.
*/
protected final void mJUNK(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
int _ttype; Token _token=null; int _begin=text.length();
_ttype = JUNK;
int _saveIndex;
switch ( LA(1)) {
case '\u0000': case '\u0001': case '\u0002': case '\u0003':
case '\u0004': case '\u0005': case '\u0006': case '\u0007':
case '\u0008':
{
matchRange('\000','\010');
break;
}
case '\u000b': case '\u000c':
{
matchRange('\013','\014');
break;
}
case '\u000e': case '\u000f': case '\u0010': case '\u0011':
case '\u0012': case '\u0013': case '\u0014': case '\u0015':
case '\u0016': case '\u0017': case '\u0018': case '\u0019':
case '\u001a': case '\u001b': case '\u001c': case '\u001d':
case '\u001e': case '\u001f':
{
matchRange('\016','\037');
break;
}
case '\u007f':
{
match('\177');
break;
}
default:
{
throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());
}
}
if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
_token = makeToken(_ttype);
_token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
}
_returnToken = _token;
}
/**
* Matches any tilde character '~' (that is not in a string or comment) and sets the token type
* to <code>skip</code> which drops such characters from the token stream. This is consistent
* with how Progress handles such characters. This also will match a '~' followed by either
* quote char. This can be seen in 4GL code (but it usually is only valid as part of a shell
* command line). If this construct is matched the token type is {@code UNKNOWN_TOKEN}.
* <p>
* This is a top level lexer rule which means that there is an associated <code>TILDE</code>
* token, however these will never be seen by the parser.
* <p>
* If the {@link #activateHiddenProcessing} is called, then tokens generated using this rule
* will not be skipped, but instead will flow through to the caller.
*/
public final void mTILDE(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
int _ttype; Token _token=null; int _begin=text.length();
_ttype = TILDE;
int _saveIndex;
{
if ((LA(1)=='~') && (LA(2)=='"')) {
match('~');
match('\"');
_ttype = UNKNOWN_TOKEN;
}
else if ((LA(1)=='~') && (LA(2)=='\'')) {
match('~');
match('\'');
_ttype = UNKNOWN_TOKEN;
}
else if ((LA(1)=='~') && (true)) {
match('~');
if (!hidden) _ttype = Token.SKIP;
}
else {
throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());
}
}
if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
_token = makeToken(_ttype);
_token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
}
_returnToken = _token;
}
/**
* Matches an entire comment, including any nested comments. The resulting
* token is set to "skip" so that the parser will not ever see
* comments in the token stream. This supports both the "slash star" and the
* "slash slash" comment styles.
* <p>
* The lexer's internal line counter is updated whenever a newline character
* is encountered.
* <p>
* Of great importance is the fact that the closure subrule for the contents
* of a comment <b>must not operate on a greedy basis</b>. Being greedy
* means that the loop will consume all possible matches to its rule
* without regard to the end of loop condition. This is the default way
* that the lexer works, but since this loop can match any character (we
* use the wildcard character because any character can be embedded in a
* comment), a greedy loop would not ever be able to detect its end
* condition. Instead we turn off greedy mode and this makes the loop
* watch for the matching comment close sequence of characters. Note that
* nested comments are possible by recursively referencing this same rule
* inside the comment contents subrule.
* <p>
* Whitespace is maintained inside the resulting comment text and the lexer's
* line counter is properly incremented upon encountering a newline.
* <p>
* This is a top level lexer rule which means that there is an associated
* <code>COMMENT</code> token.
* <p>
* If the {@link #activateHiddenProcessing} is called, then tokens generated
* using this rule will not be skipped, but instead will flow through to
* the caller.
*/
public final void mCOMMENT(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
int _ttype; Token _token=null; int _begin=text.length();
_ttype = COMMENT;
int _saveIndex;
mCMT_OPEN(false);
{
_loop1835:
do {
// nongreedy exit test
if ((LA(1)=='*') && (LA(2)=='/') && (true) && (true)) break _loop1835;
if ((LA(1)=='/') && (LA(2)=='*') && ((LA(3) >= '\u0000' && LA(3) <= '\ufffe')) && ((LA(4) >= '\u0000' && LA(4) <= '\ufffe'))) {
mCOMMENT(false);
}
else if ((LA(1)=='\n') && ((LA(2) >= '\u0000' && LA(2) <= '\ufffe')) && ((LA(3) >= '\u0000' && LA(3) <= '\ufffe')) && (true)) {
match('\n');
newline();
}
else if (((LA(1) >= '\u0000' && LA(1) <= '\ufffe')) && ((LA(2) >= '\u0000' && LA(2) <= '\ufffe')) && ((LA(3) >= '\u0000' && LA(3) <= '\ufffe')) && (true)) {
matchNot(EOF_CHAR);
}
else {
break _loop1835;
}
} while (true);
}
mCMT_CLOSE(false);
if (!hidden)
_ttype = Token.SKIP;
if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
_token = makeToken(_ttype);
_token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
}
_returnToken = _token;
}
/**
* Matches the open comment sequence of characters: <code>/*</code>
*/
protected final void mCMT_OPEN(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
int _ttype; Token _token=null; int _begin=text.length();
_ttype = CMT_OPEN;
int _saveIndex;
match("/*");
if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
_token = makeToken(_ttype);
_token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
}
_returnToken = _token;
}
/**
* Matches the close comment sequence of characters: <code>*/</code>
*/
protected final void mCMT_CLOSE(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
int _ttype; Token _token=null; int _begin=text.length();
_ttype = CMT_CLOSE;
int _saveIndex;
match("*/");
if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
_token = makeToken(_ttype);
_token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
}
_returnToken = _token;
}
/**
* Matches various string types depending upon the processing mode:
* <ul>
* <li>in <b>raw</b> processing mode, matches a double-quoted string
* encoded string which represents encoded binary (i.e., raw) data,
* setting the token type to <code>RAW_STRING</code>; otherwise
* <li>in <b>export</b> processing mode, matches a double-quoted string
* which represents a Progress string as it would appear at runtime,
* except that embedded double quotes are doubled up; otherwise
* <li>matches a single or double quoted string followed by any (optional)
* string options.
* </ul>
* <p>
* This is a top level lexer rule which means that there is an associated
* <code>STRING</code> token.
*
* @see "mRSTRING"
* @see "mXSTRING"
* @see "mSSTRING"
* @see "mDSTRING"
* @see "mSTR_OPTIONS"
*/
public final void mSTRING(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
int _ttype; Token _token=null; int _begin=text.length();
_ttype = STRING;
int _saveIndex;
{
if (((LA(1)=='"') && ((LA(2) >= '\u0000' && LA(2) <= '\ufffe')) && (true) && (true))&&( raw )) {
mRSTRING(false);
_ttype = RAW_STRING;
}
else if (((LA(1)=='"') && ((LA(2) >= '\u0000' && LA(2) <= '\ufffe')) && (true) && (true))&&( export )) {
mXSTRING(false);
}
else if ((LA(1)=='"'||LA(1)=='\'') && ((LA(2) >= '\u0000' && LA(2) <= '\ufffe')) && (true) && (true)) {
{
switch ( LA(1)) {
case '\'':
{
mSSTRING(false);
break;
}
case '"':
{
mDSTRING(false);
break;
}
default:
{
throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());
}
}
}
{
if ((LA(1)==':')) {
mSTR_OPTIONS(false);
}
else {
}
}
}
else {
throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());
}
}
if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
_token = makeToken(_ttype);
_token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
}
_returnToken = _token;
}
/**
* This rule is only invoked when in raw processing mode. Raw strings
* represent encoded binary data.
* <p>
* Matches an opening double quote, arbitrary contents and an ending double
* quote. Opening and closing double quotes are discarded.
* <p>
* Currently, no assumptions are made about the contents of the string,
* except that it will not contain an instance of a double quote, since this
* is the end delimiter. All other data is accepted exactly as is.
* Currently, no decoding is performed.
*/
protected final void mRSTRING(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
int _ttype; Token _token=null; int _begin=text.length();
_ttype = RSTRING;
int _saveIndex;
{
_saveIndex=text.length();
match('\"');
text.setLength(_saveIndex);
{
_loop1953:
do {
if ((_tokenSet_3.member(LA(1)))) {
matchNot('\"');
}
else {
break _loop1953;
}
} while (true);
}
_saveIndex=text.length();
match('\"');
text.setLength(_saveIndex);
}
if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
_token = makeToken(_ttype);
_token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
}
_returnToken = _token;
}
/**
* This rule is only invoked when in export processing mode. Export strings
* are essentially runtime strings which have no escape sequences, except
* an embedded double quote (") is doubled up ("") to avoid confusion with
* the enclosing delimiter.
* <p>
* Matches an opening double quote, arbitrary contents and an ending double
* quote. Two contiguous double quote characters are accepted as contents
* (they do not terminate the string), but they are collapsed into a single
* quote character. Opening and closing double quotes are discarded.
* <p>
* Any newlines inside the string are identified and the lexer's internal
* newline counter is properly maintained.
* <p>
* Tabs and spaces and all non-printing characters are maintained inside
* strings (including embedded binary control characters).
*/
protected final void mXSTRING(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
int _ttype; Token _token=null; int _begin=text.length();
_ttype = XSTRING;
int _saveIndex;
{
_saveIndex=text.length();
match('\"');
text.setLength(_saveIndex);
{
_loop1949:
do {
if ((LA(1)=='"') && (LA(2)=='"')) {
_saveIndex=text.length();
match("\"\"");
text.setLength(_saveIndex);
append("\"");
}
else if ((LA(1)=='\n')) {
match('\n');
newline();
}
else if ((_tokenSet_4.member(LA(1)))) {
matchNot('\"');
}
else {
break _loop1949;
}
} while (true);
}
_saveIndex=text.length();
match('\"');
text.setLength(_saveIndex);
}
if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
_token = makeToken(_ttype);
_token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
}
_returnToken = _token;
}
/**
* Matches an opening single quote, arbitrary contents and an ending single
* quote. Two contiguous single quote characters and an escape prefixed
* single quote character are accepted as contents (they do not terminate
* the string).
* <p>
* Any newlines inside the string are identified and the lexer's internal
* newline counter is properly maintained. Note that all such newlines
* are maintained in the output string because these are the escaped chars
* that have been left behind by the preprocessor. If such characters are not
* escaped, then the preprocessor removes such chars (carriage returns and
* line feeds). This is how Progress 4GL handles these characters. This
* means that in a raw source file that has not been preprocessed, a string
* literal can be split across any number of lines and the Progress
* preprocessor will put the string back together, ignoring the carriage
* returns and newlines.
* <p>
* Tilde and the backslash can BOTH be Progress escape characters and as such,
* they need special attention. Backslash is only honored if UNIX escapes
* mode is set on. In particular, this rule must separately match 4 or 8
* constructs as part of a string depending on which escape sequences are
* honored.
* <p>
* <pre>
* ~'
* '~' (probably a bug in the 4GL)
* \'
* '\' (probably a bug in the 4GL)
* ~~
* ~\
* \\
* \~
* ~
* \
* </pre>
* <p>
* The first 4 are a way of embedding a quote in a string. The next 4 are
* important because if this rule were to encounter '~~', '\\', '~\' or '\~'
* (which are valid strings) the rule would consume the first escape and then
* encounter an escaped quote which would not terminate the string properly,
* leading to a non-ending string. So this rule matches on any escaped escape
* char to eliminate this situation. Finally, a single ~ or \ that is not
* followed by a " or a duplicate escape char is matched as a single
* character. This is required (one may think that the closure rule
* should handle this case) because when ANTLR sees a ~ or \ in the leftmost
* position of the alternatives, it DOES NOT include it in the list of
* 'everything that is not a closing quote'. Likewise \n is not included.
* Of course, these tilde constructions must be placed in a specific order
* and if so, the ambiguity warnings that ANTLR reports can be disabled.
* <p>
* The greedy option does not need to be disabled here as the closure rule
* termination is built into the subrule itself: it accepts anything that
* isn't an unescaped single quote character (see above).
* <p>
* Tabs and spaces are maintained inside strings.
*/
protected final void mSSTRING(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
int _ttype; Token _token=null; int _begin=text.length();
_ttype = SSTRING;
int _saveIndex;
{
match('\'');
{
_loop1940:
do {
if ((LA(1)=='~') && (LA(2)=='\'') && ((LA(3) >= '\u0000' && LA(3) <= '\ufffe')) && (true)) {
match("~\'");
}
else if ((LA(1)=='~') && (LA(2)=='~') && ((LA(3) >= '\u0000' && LA(3) <= '\ufffe')) && (true)) {
match("~~");
}
else if ((LA(1)=='~') && (LA(2)=='\\') && ((LA(3) >= '\u0000' && LA(3) <= '\ufffe')) && (true)) {
match("~\\");
}
else if (((LA(1)=='\\') && (LA(2)=='\'') && ((LA(3) >= '\u0000' && LA(3) <= '\ufffe')) && (true))&&( unixEscapes )) {
match("\\\'");
}
else if (((LA(1)=='\\') && (LA(2)=='\\') && ((LA(3) >= '\u0000' && LA(3) <= '\ufffe')) && (true))&&( unixEscapes )) {
match("\\\\");
}
else if (((LA(1)=='\\') && (LA(2)=='~') && ((LA(3) >= '\u0000' && LA(3) <= '\ufffe')) && (true))&&( unixEscapes )) {
match("\\~");
}
else if (((LA(1)=='\r') && (LA(2)=='\n') && ((LA(3) >= '\u0000' && LA(3) <= '\ufffe')) && (true))&&( schema )) {
_saveIndex=text.length();
match("\r\n");
text.setLength(_saveIndex);
append(' ');
newline();
}
else if (((LA(1)=='\'') && (LA(2)=='~'))&&( LA(3) == '\'' )) {
match("\'~\'");
}
else if ((LA(1)=='~') && ((LA(2) >= '\u0000' && LA(2) <= '\ufffe')) && (true) && (true)) {
match('~');
}
else if (((LA(1)=='\'') && (LA(2)=='\\'))&&( unixEscapes && LA(3) == '\'' )) {
match("\'\\\'");
}
else if ((LA(1)=='\\') && ((LA(2) >= '\u0000' && LA(2) <= '\ufffe')) && (true) && (true)) {
match('\\');
}
else if ((LA(1)=='\'') && (LA(2)=='\'')) {
match("\'\'");
}
else if (((LA(1)=='\n'||LA(1)=='\r') && ((LA(2) >= '\u0000' && LA(2) <= '\ufffe')) && (true) && (true))&&( schema )) {
{
switch ( LA(1)) {
case '\n':
{
_saveIndex=text.length();
match('\n');
text.setLength(_saveIndex);
break;
}
case '\r':
{
_saveIndex=text.length();
match('\r');
text.setLength(_saveIndex);
break;
}
default:
{
throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());
}
}
}
append(' ');
newline();
}
else if ((LA(1)=='\n') && ((LA(2) >= '\u0000' && LA(2) <= '\ufffe')) && (true) && (true)) {
match('\n');
newline();
}
else if ((_tokenSet_5.member(LA(1)))) {
matchNot('\'');
}
else {
break _loop1940;
}
} while (true);
}
match('\'');
}
if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
_token = makeToken(_ttype);
_token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
}
_returnToken = _token;
}
/**
* Matches an opening double quote, arbitrary contents and an ending double
* quote. Two contiguous double quote characters and an escape prefixed
* double quote character are accepted as contents (they do not terminate
* the string).
* <p>
* Any newlines inside the string are identified and the lexer's internal
* newline counter is properly maintained. Note that all such newlines
* are maintained in the output string because these are the escaped chars
* that have been left behind by the preprocessor. If such characters are not
* escaped, then the preprocessor removes such chars (carriage returns and
* line feeds). This is how Progress 4GL handles these characters. This
* means that in a raw source file that has not been preprocessed, a string
* literal can be split across any number of lines and the Progress
* preprocessor will put the string back together, ignoring the carriage
* returns and newlines.
* <p>
* Tilde and the backslash can BOTH be Progress escape characters and as such,
* they need special attention. Backslash is only honored if UNIX escapes
* mode is set on. In particular, this rule must separately match 4 or 8
* constructs as part of a string depending on which escape sequences are
* honored.
* <p>
* <pre>
* ~"
* "~" (probably a bug in the 4GL)
* \"
* "\" (probably a bug in the 4GL)
* ~~
* ~\
* \\
* \~
* ~
* \
* </pre>
* <p>
* The first 4 are a way of embedding a quote in a string. The next 4 are
* important because if this rule were to encounter '~~', '\\', '~\' or '\~'
* (which are valid strings) the rule would consume the first escape and then
* encounter an escaped quote which would not terminate the string properly,
* leading to a non-ending string. So this rule matches on any escaped escape
* char to eliminate this situation. Finally, a double ~ or \ that is not
* followed by a " or a duplicate escape char is matched as a double
* character. This is required (one may think that the closure rule
* should handle this case) because when ANTLR sees a ~ or \ in the leftmost
* position of the alternatives, it DOES NOT include it in the list of
* 'everything that is not a closing quote'. Likewise \n is not included.
* Of course, these tilde constructions must be placed in a specific order
* and if so, the ambiguity warnings that ANTLR reports can be disabled.
* <p>
* The greedy option does not need to be disabled here as the closure rule
* termination is built into the subrule itself: it accepts anything that
* isn't an unescaped double quote character (see above).
* <p>
* Tabs and spaces are maintained inside strings.
*/
protected final void mDSTRING(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
int _ttype; Token _token=null; int _begin=text.length();
_ttype = DSTRING;
int _saveIndex;
{
match('\"');
{
_loop1945:
do {
if ((LA(1)=='~') && (LA(2)=='"') && ((LA(3) >= '\u0000' && LA(3) <= '\ufffe')) && (true)) {
match("~\"");
}
else if ((LA(1)=='~') && (LA(2)=='~') && ((LA(3) >= '\u0000' && LA(3) <= '\ufffe')) && (true)) {
match("~~");
}
else if ((LA(1)=='~') && (LA(2)=='\\') && ((LA(3) >= '\u0000' && LA(3) <= '\ufffe')) && (true)) {
match("~\\");
}
else if (((LA(1)=='\\') && (LA(2)=='"') && ((LA(3) >= '\u0000' && LA(3) <= '\ufffe')) && (true))&&( unixEscapes )) {
match("\\\"");
}
else if (((LA(1)=='\\') && (LA(2)=='\\') && ((LA(3) >= '\u0000' && LA(3) <= '\ufffe')) && (true))&&( unixEscapes )) {
match("\\\\");
}
else if (((LA(1)=='\\') && (LA(2)=='~') && ((LA(3) >= '\u0000' && LA(3) <= '\ufffe')) && (true))&&( unixEscapes )) {
match("\\~");
}
else if (((LA(1)=='\r') && (LA(2)=='\n') && ((LA(3) >= '\u0000' && LA(3) <= '\ufffe')) && (true))&&( schema )) {
_saveIndex=text.length();
match("\r\n");
text.setLength(_saveIndex);
append(' ');
newline();
}
else if (((LA(1)=='"') && (LA(2)=='~'))&&( LA(3) == '"' )) {
match("\"~\"");
}
else if ((LA(1)=='~') && ((LA(2) >= '\u0000' && LA(2) <= '\ufffe')) && (true) && (true)) {
match('~');
}
else if (((LA(1)=='"') && (LA(2)=='\\'))&&( unixEscapes && LA(3) == '"' )) {
match("\"\\\"");
}
else if ((LA(1)=='\\') && ((LA(2) >= '\u0000' && LA(2) <= '\ufffe')) && (true) && (true)) {
match('\\');
}
else if ((LA(1)=='"') && (LA(2)=='"')) {
match("\"\"");
}
else if (((LA(1)=='\n'||LA(1)=='\r') && ((LA(2) >= '\u0000' && LA(2) <= '\ufffe')) && (true) && (true))&&( schema )) {
{
switch ( LA(1)) {
case '\n':
{
_saveIndex=text.length();
match('\n');
text.setLength(_saveIndex);
break;
}
case '\r':
{
_saveIndex=text.length();
match('\r');
text.setLength(_saveIndex);
break;
}
default:
{
throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());
}
}
}
append(' ');
newline();
}
else if ((LA(1)=='\n') && ((LA(2) >= '\u0000' && LA(2) <= '\ufffe')) && (true) && (true)) {
match('\n');
newline();
}
else if ((_tokenSet_6.member(LA(1)))) {
matchNot('\"');
}
else {
break _loop1945;
}
} while (true);
}
match('\"');
}
if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
_token = makeToken(_ttype);
_token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
}
_returnToken = _token;
}
/**
* Matches the options that can be appended to a Progress string literal.
* These options consist of 4 parts, some of which are optional. String
* options always start with a ':' which must follow the string's ending
* single or double quote with no intervening whitespace. After that
* colon, there must be one or more of a justification, size allocation in
* characters and a flag noting if this string is translatable or not.
* <pre>
* justification 'r' | 'l' | 'c' | 't'
* translatable 'u' | 'x'
* size integer literal (one or more contiguous digits)
* </pre>
* <p>
* The use of 'X' is an undocumented feature of the 4GL and it can only appear
* if 'U' is not present. The meaning of this is not yet known.
* <p>
* These options can come in any order and at least one of them must appear.
* This causes some problems since there is no simple syntax to specify
* such conditions in the grammar. Whitespace cannot be placed between any
* of the options.
* <p>
* In addition, just as the lookahead for the <code>mDEC_LITERAL</code> rule
* could incorrectly 'pull' processing down into that rule as a false match,
* so too can this happen here. For this reason, the possible alternatives
* are specified and then the empty alternative is used to detect a false
* match and the lexer's stream input is manually reset to backup and restart
* processing at the top-level.
* <p>
* None of this would be possible if comments or whitespace were allowed in
* string options. They are not.
*/
protected final void mSTR_OPTIONS(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
int _ttype; Token _token=null; int _begin=text.length();
_ttype = STR_OPTIONS;
int _saveIndex;
// save state *before* matching of ':' so we can reset if it is
// really supposed to be a statement separator and not string
// options as we first thought
boolean commitFlag = true;
int back = mark();
String save = getText();
{
match(':');
{
if ((_tokenSet_7.member(LA(1))) && (LA(2)=='u'||LA(2)=='x')) {
{
switch ( LA(1)) {
case 'r':
{
match('r');
break;
}
case 'l':
{
match('l');
break;
}
case 'c':
{
match('c');
break;
}
case 't':
{
match('t');
break;
}
default:
{
throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());
}
}
}
{
switch ( LA(1)) {
case 'u':
{
match('u');
break;
}
case 'x':
{
match('x');
break;
}
default:
{
throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());
}
}
}
{
_loop1960:
do {
if (((LA(1) >= '0' && LA(1) <= '9'))) {
mDIGIT(false);
}
else {
break _loop1960;
}
} while (true);
}
}
else if ((_tokenSet_7.member(LA(1))) && ((LA(2) >= '0' && LA(2) <= '9'))) {
{
switch ( LA(1)) {
case 'r':
{
match('r');
break;
}
case 'l':
{
match('l');
break;
}
case 'c':
{
match('c');
break;
}
case 't':
{
match('t');
break;
}
default:
{
throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());
}
}
}
{
int _cnt1963=0;
_loop1963:
do {
if (((LA(1) >= '0' && LA(1) <= '9'))) {
mDIGIT(false);
}
else {
if ( _cnt1963>=1 ) { break _loop1963; } else {throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());}
}
_cnt1963++;
} while (true);
}
{
switch ( LA(1)) {
case 'u':
{
match('u');
break;
}
case 'x':
{
match('x');
break;
}
default:
{
}
}
}
}
else if ((LA(1)=='u'||LA(1)=='x') && (_tokenSet_7.member(LA(2)))) {
{
switch ( LA(1)) {
case 'u':
{
match('u');
break;
}
case 'x':
{
match('x');
break;
}
default:
{
throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());
}
}
}
{
switch ( LA(1)) {
case 'r':
{
match('r');
break;
}
case 'l':
{
match('l');
break;
}
case 'c':
{
match('c');
break;
}
case 't':
{
match('t');
break;
}
default:
{
throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());
}
}
}
{
_loop1969:
do {
if (((LA(1) >= '0' && LA(1) <= '9'))) {
mDIGIT(false);
}
else {
break _loop1969;
}
} while (true);
}
}
else if ((LA(1)=='u'||LA(1)=='x') && ((LA(2) >= '0' && LA(2) <= '9'))) {
{
switch ( LA(1)) {
case 'u':
{
match('u');
break;
}
case 'x':
{
match('x');
break;
}
default:
{
throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());
}
}
}
{
int _cnt1972=0;
_loop1972:
do {
if (((LA(1) >= '0' && LA(1) <= '9'))) {
mDIGIT(false);
}
else {
if ( _cnt1972>=1 ) { break _loop1972; } else {throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());}
}
_cnt1972++;
} while (true);
}
{
switch ( LA(1)) {
case 'r':
{
match('r');
break;
}
case 'l':
{
match('l');
break;
}
case 'c':
{
match('c');
break;
}
case 't':
{
match('t');
break;
}
default:
{
}
}
}
}
else if ((_tokenSet_7.member(LA(1))) && (true)) {
{
switch ( LA(1)) {
case 'r':
{
match('r');
break;
}
case 'l':
{
match('l');
break;
}
case 'c':
{
match('c');
break;
}
case 't':
{
match('t');
break;
}
default:
{
throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());
}
}
}
}
else if ((LA(1)=='u'||LA(1)=='x') && (true)) {
{
switch ( LA(1)) {
case 'u':
{
match('u');
break;
}
case 'x':
{
match('x');
break;
}
default:
{
throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());
}
}
}
}
else if (((LA(1) >= '0' && LA(1) <= '9'))) {
{
int _cnt1976=0;
_loop1976:
do {
if (((LA(1) >= '0' && LA(1) <= '9'))) {
mDIGIT(false);
}
else {
if ( _cnt1976>=1 ) { break _loop1976; } else {throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());}
}
_cnt1976++;
} while (true);
}
{
switch ( LA(1)) {
case 'c': case 'l': case 'r': case 't':
{
{
{
switch ( LA(1)) {
case 'r':
{
match('r');
break;
}
case 'l':
{
match('l');
break;
}
case 'c':
{
match('c');
break;
}
case 't':
{
match('t');
break;
}
default:
{
throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());
}
}
}
{
switch ( LA(1)) {
case 'u':
{
match('u');
break;
}
case 'x':
{
match('x');
break;
}
default:
{
}
}
}
}
break;
}
case 'u': case 'x':
{
{
{
switch ( LA(1)) {
case 'u':
{
match('u');
break;
}
case 'x':
{
match('x');
break;
}
default:
{
throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());
}
}
}
{
switch ( LA(1)) {
case 'r':
{
match('r');
break;
}
case 'l':
{
match('l');
break;
}
case 'c':
{
match('c');
break;
}
case 't':
{
match('t');
break;
}
default:
{
}
}
}
}
break;
}
default:
{
}
}
}
}
else {
// We match the EMPTY alternative if one of the valid
// string options is not found above!!!!!
// Abort! Reset state to remove the already matched ':'.
commitFlag = false;
setText( save );
rewind( back );
}
}
}
// if we did not rewind, we need to reset our mark without rewinding
if ( commitFlag )
commit();
if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
_token = makeToken(_ttype);
_token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
}
_returnToken = _token;
}
/**
* Match any valid symbol name in the Progress 4GL language or the standalone
* <code>DIVIDE</code> operator '/'. This includes the following:
* <ul>
* <li> divide sign '/'
* <li> underscore '_' (does not have a token type of its own, it is a
* generic symbol if found on its own)
* <li> language keywords (reserved and unreserved)
* <li> variables (global shared, scoped shared and local)
* <li> database, table and field names
* <li> user-defined functions
* <li> built-in functions of the Progress 4GL
* <li> internal procedure names
* <li> labels
* <li> path and filenames (which include any valid symbol character
* as well as '/' or '\' or '.' or '..') which supports absolute
* and relative filenames including the special references to
* the current directory and the parent directory
* <li> single '\' is matched but then discarded (it is never seen by
* the parser because its type is set to <code>SKIP</code>
* <li> r-code library references in the form
* <code>pathname<<membername>></code>
* <li> other user-defined names (e.g. frames, temp-tables etc.)
* </ul>
* <p>
* All symbols must start with an alphabetic character. Starting in the
* second character and continuing to a maximum of 32 characters (including
* the initial character), can be any alphabetic and numeric characters or
* one of the special symbol characters (<code> # $ % & - _ </code>).
* <b>Symbols are matched case-insensitively.</b>
* <p>
* An exception to the previous rule that a symbol must start with an
* alphabetic character is for special meta-data entries in the Progress
* schema dictionary, whose table and field names start with an underscore.
* For this reason, such entries are allowed more generally such that the
* rule as implemented is: the first letter of every symbol must be an
* alphabetic character or an underscore.
* <p>
* Another exception to the previous rule that a symbol must start with an
* alphabetic character is for a filename. Filenames <b>may also</b> start
* with the '/' or '\' characters (in which case they are absolute filenames).
* The second and following characters in filenames can include '/', '\' or
* '.' in addition to all the special symbol characters listed above. Filenames
* may also include a "naked" embedded double quote or single quote character
* so long as there is no intervening whitespace. These embedded quotes cannot
* be the leading character but can appear deeper in and they are not considered
* the start of a string. These can be referenced in RUN statements and as
* procedure names (in an internal definition or as an external filename).
* <p>
* In addition, DOS and Windows filenames can start with a drive letter
* followed by a ':' as in 'c:'. This construct is matched as a symbol
* followed by a colon. This is needed to allow single character variable
* names + attribute or method calls to properly work in the parser. The
* difficulty with putting the whole thing together again into a single
* filename is left to the {@link ProgressParser#filename} rule.
* <p>
* <b>Note that there are many characters that are not allowed in filenames
* at this time. This is an artificial limitation designed to keep the
* current lexer simple and compatible with the known/common cases of
* filenames while not introducing too many potential ambiguities.
* Examples of characters that are not matched include: '~', '!', '@', '^',
* '+', '='. The general rule: if the character is not a valid symbol char,
* '/', '\', '.' or '..' then it is not matched.</b> This can be changed if
* necessary, but the decision was made to defer such handling until the
* need arises. When a filename is detected the token type is set to
* <code>FILENAME</code>. Both relative and absolute filenames are matched
* by this rule (except for the drive letter component as noted above).
* <p>
* Since the '/' character is matched in this rule, an inherent ambiguity
* was created with any top level <code>DIVIDE</code> rule that matches '/'.
* For this reason, the ambiguity was resolved by matching on a standalone
* '/' in this rule and setting the resulting token type to
* <code>DIVIDE</code>. The top level <code>DIVIDE</code> rule was
* removed.
* <p>
* The '\' is a special case in Progress. This character can be inserted
* anywhere and it is simply ignored. This feature is supported in this
* rule as well, but matching a standalone backslash and setting it's type
* to <code>SKIP</code>. Note that a backslash that is part of a larger
* filename, is NOT skipped.
* <p>
* To avoid lexer non-determinism, any filename that starts with './', '../',
* '.\' or '..\' is actually matched at the top level by
* {@link #mNUM_LITERAL}. This is needed because the <code>DOT</code> in the
* first position conflicts. So instead, once <code>mNUM_LITERAL</code>
* matches one of these strings, it includes this rule optionally. This
* allows all normal filename processing to occur as needed but doesn't
* require it since the previous string can legitimately stand alone.
* <p>
* R-code library references are matched with the format
* <code>pathname<<membername>></code>. This allows any filename
* to be specified as a prefix and then the library member name followed
* as a suffix, but contained in the unambiguous double angle brackets.
* When this construction is matched, the token type is set to
* <code>LIBRARY_REF</code>.
* <p>
* A special case exists for partially or fully qualified database symbols.
* Such symbols are comprised of 2 or 3 regular symbols, each separated
* by a '.' and no whitespace. This method recognizes such optional
* constructions and sets the token type to <code>DB_SYMBOL</code>. In
* order to make this extra check work, the optional section (following the
* first or main symbol definition) is differentiated using a semantic
* predicate. This only allows the database symbol matching if the following
* conditions hold:
* <ul>
* <li> a <code>DOT</code> character is found after the symbol without
* any intervening whitespace
* <li> the next character after the <code>DOT</code> is an alphabetic
* character (it can't be numeric or a special symbol because each
* part of the qualified database symbol name must follow the
* standard rules (see above) for symbol naming
* </ul>
* <p>
* There is a second optional section nested inside the first one, which
* handles the condition where there is a fully qualified field name. The
* resulting possible constructions are:
* <pre>
* user-defined symbol or unqualified db/table/field name --> sym
* fully qualified table or partially qualified field name --> sym.sym
* fully qualified field name --> sym.sym.sym
* </pre>
* <p>
* Any unqualified database, table or field names will be lexed as a standard
* symbol (which is the default token type). But in any case where a simple
* symbol is followed by a '.' AND an alphabetic character with no
* intervening whitespace, this is known to be a qualified database name and
* it <b>cannot</b> be a generic symbol or language keyword. <b>If there is
* ever a testcase found that does not follow this rule, this method will
* break, badly!</b>
* <p>
* It is also important to note that any relative filename that does not
* include any path separator ('/' or '\') and which does not have any more
* than 2 '.' characters will be matched as a <code>DB_SYMBOL</code> due to
* inherent ambiguity in the Progress decision to use the '.' as the
* database qualifier. This means that the parser must be aware that some
* filenames can appear as database symbols.
* <p>
* Most importantly, once a symbol has been found, a keyword lookup occurs
* and the token type is overridden from the default (<code>SYMBOL</code>)
* to the artificial token type associated with the keyword (see
* <code>initializeKeywordDictionary</code>). The parser may subsequently
* override this token type yet again, but this is the extent of the lexer's
* symbol resolution. <b>Keyword token types take precedence over the
* default token type <code>SYMBOL</code>, however only <code>SYMBOL</code>
* types are overridden since there are no circumstances in which there are
* language keywords that can match database symbols, filenames or library
* references.</b> All
* <code>DIVIDE, DB_SYMBOL, FILENAME and LIBRARY_REF</code> token types
* bypass the keyword lookup and override.
* <p>
* See the overview for a discussion of how and why the symbol resolution
* in this method is limited to keywords and the
* <code>SYMBOL, DIVIDE, DB_SYMBOL, FILENAME and LIBRARY_REF</code> token
* types.
* <p>
* This is a top level lexer rule which means that there is an associated
* <code>SYMBOL</code> token. The
* <code>DIVIDE, DB_SYMBOL, FILENAME and LIBRARY_REF</code> tokens are
* artificially created in the parser so that they can be manually set
* here as an override.
* <p>
* Standalone backslashes are set to <code>skip</code> by default. However,
* if the {@link #activateHiddenProcessing} is called, then tokens generated
* using this rule will not be skipped, but instead will flow through to
* the caller.
*
* @see "mLETTER"
* @see "mDIGIT"
* @see "mSYM_CHAR"
* @see Keyword
* @see KeywordDictionary
* @see SymbolResolver
*/
public final void mSYMBOL(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
int _ttype; Token _token=null; int _begin=text.length();
_ttype = SYMBOL;
int _saveIndex;
int stype = SYMBOL;
{
switch ( LA(1)) {
case 'a': case 'b': case 'c': case 'd':
case 'e': case 'f': case 'g': case 'h':
case 'i': case 'j': case 'k': case 'l':
case 'm': case 'n': case 'o': case 'p':
case 'q': case 'r': case 's': case 't':
case 'u': case 'v': case 'w': case 'x':
case 'y': case 'z':
{
mLETTER(false);
break;
}
case '_':
{
match('_');
break;
}
default:
if ((LA(1)=='/') && (_tokenSet_8.member(LA(2))) && (true) && (true)) {
match('/');
mVALID_SYM_CHAR(false);
stype = FILENAME;
}
else if (((LA(1)=='/') && (LA(2)=='/') && (true) && (true))&&( allowSlashSlash )) {
mSLASH_SLASH(false);
stype = COMMENT;
{
_loop1844:
do {
if ((_tokenSet_9.member(LA(1))) && (true) && (true) && (true)) {
{
match(_tokenSet_9);
}
}
else {
break _loop1844;
}
} while (true);
}
}
else if ((LA(1)=='\\') && (_tokenSet_8.member(LA(2))) && (true) && (true)) {
match('\\');
mVALID_SYM_CHAR(false);
stype = FILENAME;
}
else if ((LA(1)=='/') && (true) && (true) && (true)) {
match('/');
stype = DIVIDE;
}
else if ((LA(1)=='\\') && (true) && (true) && (true)) {
match('\\');
stype = BACKSLASH;
}
else {
throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());
}
}
}
{
_loop1846:
do {
switch ( LA(1)) {
case '#': case '$': case '%': case '&':
case '-': case '0': case '1': case '2':
case '3': case '4': case '5': case '6':
case '7': case '8': case '9': case '_':
case 'a': case 'b': case 'c': case 'd':
case 'e': case 'f': case 'g': case 'h':
case 'i': case 'j': case 'k': case 'l':
case 'm': case 'n': case 'o': case 'p':
case 'q': case 'r': case 's': case 't':
case 'u': case 'v': case 'w': case 'x':
case 'y': case 'z':
{
mVALID_SYM_CHAR(false);
break;
}
case '\\':
{
match('\\');
stype = FILENAME;
break;
}
default:
if ((LA(1)=='.') && (LA(2)=='.') && (LA(3)=='/') && (true)) {
match("../");
stype = FILENAME;
}
else if ((LA(1)=='.') && (LA(2)=='.') && (LA(3)=='\\') && (true)) {
match("..\\");
stype = FILENAME;
}
else if ((LA(1)=='.') && (LA(2)=='/') && (true) && (true)) {
match("./");
stype = FILENAME;
}
else if ((LA(1)=='.') && (LA(2)=='\\') && (true) && (true)) {
match(".\\");
stype = FILENAME;
}
else if (((LA(1)=='/'))&&( stype != BACKSLASH && stype != DIVIDE )) {
match('/');
stype = FILENAME;
}
else if (((LA(1)=='"'))&&( LA(2) != ' ' && LA(2) != '\t' && LA(2) != '\r' && LA(2) != '\n' )) {
match('\"');
stype = FILENAME;
}
else if (((LA(1)=='\''))&&( LA(2) != ' ' && LA(2) != '\t' && LA(2) != '\r' && LA(2) != '\n' )) {
match('\'');
stype = FILENAME;
}
else if (((LA(1)=='.') && (true) && (true) && (true))&&(
(LA(2) >= 'a' && LA(2) <= 'z') ||
(LA(2) >= '0' && LA(2) <= '9') ||
LA(2) == '#' || LA(2) == '$' ||
LA(2) == '%' || LA(2) == '&' ||
LA(2) == '-' || LA(2) == '_'
)) {
match('.');
if (stype == SYMBOL) stype = DB_SYMBOL;
}
else {
break _loop1846;
}
}
} while (true);
}
{
if (((LA(1)=='<'))&&( LA(2) == '<' )) {
match("<<");
mLETTER(false);
{
_loop1849:
do {
switch ( LA(1)) {
case '#': case '$': case '%': case '&':
case '-': case '0': case '1': case '2':
case '3': case '4': case '5': case '6':
case '7': case '8': case '9': case '_':
case 'a': case 'b': case 'c': case 'd':
case 'e': case 'f': case 'g': case 'h':
case 'i': case 'j': case 'k': case 'l':
case 'm': case 'n': case 'o': case 'p':
case 'q': case 'r': case 's': case 't':
case 'u': case 'v': case 'w': case 'x':
case 'y': case 'z':
{
mVALID_SYM_CHAR(false);
break;
}
case '.':
{
match('.');
break;
}
default:
{
break _loop1849;
}
}
} while (true);
}
match(">>");
stype = LIBRARY_REF;
}
else {
}
}
// standalone backslash chars must be ignored (they can be
// arbitrarily inserted in Progress code and make no difference)
if ( stype == BACKSLASH )
{
if (getText().equals("\\"))
{
if (!hidden)
{
// ignore the standalone backslash
stype = Token.SKIP;
}
}
else
{
// backslash is not a valid token to be seen in the parser
// in this case, it must really be a filename
stype = FILENAME;
}
}
// in order to handle filenames (which can include the '.' char)
// we had to make the DB_SYMBOL matching more generic since there
// is no way to know in the lexer, whether a simple "hello.p" is
// a DB_SYMBOL or a FILENAME; for this reason we add this test to
// force something to a FILENAME token type based on finding
// a value that couldn't be in a DB_SYMBOL
if (stype == DB_SYMBOL)
{
int count = 0;
int index = 0;
boolean invalid = false;
String txt = new String(text.getBuffer(),_begin,text.length()-_begin);
while ( index != -1 )
{
index = txt.indexOf('.', index+1);
if (index != -1)
{
// this next code works because we know that there will
// never be a '.' as the last char of a symbol (not legal
// in Progress because this would be ambiguous with '.'
// as an end of statement delimiter) --> if this ever
// changes, this code will throw an
// java.lang.StringIndexOutOfBoundsException
char ch = (char) txt.charAt(index+1);
if (Character.isLetter(ch) == false && ch != '_')
invalid = true;
count++;
}
}
if (invalid || count > 2)
stype = FILENAME;
}
// only generic symbols need to be overridden by possible keyword
// matches; partially/fully qualified database object (table or
// field) names OR filenames OR the DIVIDE operator OR r-code library
// references cannot be keywords, so we bypass this logic
if (stype == SYMBOL)
{
// non-database path which could be a keyword, we bias toward
// this outcome due to the keyword-rich design of Progress 4GL
Keyword found = sym.lookupKeyword(getText());
if (found != null)
{
// we will *assume* we are a keyword (we may actually be a
// user-defined symbol, but we will handle that in the parser
stype = found.getTokenType();
}
}
_ttype = stype;
if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
_token = makeToken(_ttype);
_token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
}
_returnToken = _token;
}
/**
* Matches any single character that can appear in the 2nd or later position
* in a symbol (matches any <code>LETTER, DIGIT or SYM_CHAR</code>). This is
* simply a helper rule to make references easier.
*/
protected final void mVALID_SYM_CHAR(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
int _ttype; Token _token=null; int _begin=text.length();
_ttype = VALID_SYM_CHAR;
int _saveIndex;
switch ( LA(1)) {
case 'a': case 'b': case 'c': case 'd':
case 'e': case 'f': case 'g': case 'h':
case 'i': case 'j': case 'k': case 'l':
case 'm': case 'n': case 'o': case 'p':
case 'q': case 'r': case 's': case 't':
case 'u': case 'v': case 'w': case 'x':
case 'y': case 'z':
{
mLETTER(false);
break;
}
case '0': case '1': case '2': case '3':
case '4': case '5': case '6': case '7':
case '8': case '9':
{
mDIGIT(false);
break;
}
case '#': case '$': case '%': case '&':
case '-': case '_':
{
mSYM_CHAR(false);
break;
}
default:
{
throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());
}
}
if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
_token = makeToken(_ttype);
_token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
}
_returnToken = _token;
}
/**
* Matches the start of a new-style single-line Progress 4GL comment that will extend to the end
* of the current line.
*/
protected final void mSLASH_SLASH(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
int _ttype; Token _token=null; int _begin=text.length();
_ttype = SLASH_SLASH;
int _saveIndex;
match('/');
match('/');
if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
_token = makeToken(_ttype);
_token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
}
_returnToken = _token;
}
/**
* Matches any alphabetic character: <code>a - z</code>.
*/
protected final void mLETTER(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
int _ttype; Token _token=null; int _begin=text.length();
_ttype = LETTER;
int _saveIndex;
matchRange('a','z');
if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
_token = makeToken(_ttype);
_token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
}
_returnToken = _token;
}
/**
* Matches the ':' character. This is a top level rule, creating a
* <code>COLON</code> token type.
* <p>
* The hidden token stream can be used to determine whether the colon was
* followed by whitespace or not. This is needed in the parser to
* differentiate between labels (which must always be followed by whitespace)
* and attributes/methods where the colon cannot be followed by whitespace.
*/
public final void mCOLON(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
int _ttype; Token _token=null; int _begin=text.length();
_ttype = COLON;
int _saveIndex;
match(':');
if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
_token = makeToken(_ttype);
_token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
}
_returnToken = _token;
}
/**
* Matches the '::' non-static database reference "operator". This is a top
* level rule, creating a <code>DB_REF_NON_STATIC</code> token type.
* <p>
* The hidden token stream can be used to determine whether the colon was
* followed by whitespace or not. This is needed in the parser to
* differentiate between labels (which must always be followed by whitespace)
* and attributes/methods where the colon cannot be followed by whitespace.
*/
public final void mDB_REF_NON_STATIC(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
int _ttype; Token _token=null; int _begin=text.length();
_ttype = DB_REF_NON_STATIC;
int _saveIndex;
match("::");
if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
_token = makeToken(_ttype);
_token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
}
_returnToken = _token;
}
/**
* Matches the ',' character. This is a top level rule, creating a
* <code>COMMA</code> token type.
*/
public final void mCOMMA(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
int _ttype; Token _token=null; int _begin=text.length();
_ttype = COMMA;
int _saveIndex;
match(',');
if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
_token = makeToken(_ttype);
_token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
}
_returnToken = _token;
}
/**
* Matches the '=' character. This is a top level rule, creating a
* <code>EQUALS</code> token type.
*/
public final void mEQUALS(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
int _ttype; Token _token=null; int _begin=text.length();
_ttype = EQUALS;
int _saveIndex;
match('=');
if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
_token = makeToken(_ttype);
_token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
}
_returnToken = _token;
}
/**
* Matches the '*=' operator. This is a top-level rule, creating a
* <code>MULT_ASSIGN</code> token type.
*/
public final void mMULT_ASSIGN(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
int _ttype; Token _token=null; int _begin=text.length();
_ttype = MULT_ASSIGN;
int _saveIndex;
match('*');
match('=');
if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
_token = makeToken(_ttype);
_token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
}
_returnToken = _token;
}
/**
* Matches the '+=' operator. This is a top-level rule, creating a
* <code>PLUS_ASSIGN</code> token type.
*/
public final void mPLUS_ASSIGN(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
int _ttype; Token _token=null; int _begin=text.length();
_ttype = PLUS_ASSIGN;
int _saveIndex;
match('+');
match('=');
if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
_token = makeToken(_ttype);
_token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
}
_returnToken = _token;
}
/**
* Matches the '-=' operator. This is a top-level rule, creating a
* <code>MINUS_ASSIGN</code> token type.
*/
public final void mMINUS_ASSIGN(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
int _ttype; Token _token=null; int _begin=text.length();
_ttype = MINUS_ASSIGN;
int _saveIndex;
match('-');
match('=');
if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
_token = makeToken(_ttype);
_token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
}
_returnToken = _token;
}
/**
* Matches the '/=' operator. This is a top-level rule, creating a
* <code>DIV_ASSIGN</code> token type.
*/
public final void mDIV_ASSIGN(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
int _ttype; Token _token=null; int _begin=text.length();
_ttype = DIV_ASSIGN;
int _saveIndex;
match('/');
match('=');
if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
_token = makeToken(_ttype);
_token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
}
_returnToken = _token;
}
/**
* Matches the '<>' character sequence. This is a top level rule, creating a
* <code>NOT_EQ</code> token type.
*/
public final void mNOT_EQ(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
int _ttype; Token _token=null; int _begin=text.length();
_ttype = NOT_EQ;
int _saveIndex;
match("<>");
if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
_token = makeToken(_ttype);
_token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
}
_returnToken = _token;
}
/**
* Matches the '>' character. This is a top level rule, creating a
* <code>GT</code> token type.
*/
public final void mGT(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
int _ttype; Token _token=null; int _begin=text.length();
_ttype = GT;
int _saveIndex;
match('>');
if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
_token = makeToken(_ttype);
_token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
}
_returnToken = _token;
}
/**
* Matches the '<' character. This is a top level rule, creating a
* <code>LT</code> token type.
*/
public final void mLT(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
int _ttype; Token _token=null; int _begin=text.length();
_ttype = LT;
int _saveIndex;
match('<');
if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
_token = makeToken(_ttype);
_token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
}
_returnToken = _token;
}
/**
* Matches the '>=' character sequence. This is a top level rule, creating
* a <code>GTE</code> token type.
*/
public final void mGTE(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
int _ttype; Token _token=null; int _begin=text.length();
_ttype = GTE;
int _saveIndex;
match(">=");
if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
_token = makeToken(_ttype);
_token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
}
_returnToken = _token;
}
/**
* Matches the '<=' character sequence. This is a top level rule, creating
* a <code>LTE</code> token type.
*/
public final void mLTE(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
int _ttype; Token _token=null; int _begin=text.length();
_ttype = LTE;
int _saveIndex;
match("<=");
if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
_token = makeToken(_ttype);
_token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
}
_returnToken = _token;
}
/**
* Matches the '(' character. This is a top level rule, creating a
* <code>LPARENS</code> token type.
*/
public final void mLPARENS(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
int _ttype; Token _token=null; int _begin=text.length();
_ttype = LPARENS;
int _saveIndex;
match('(');
if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
_token = makeToken(_ttype);
_token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
}
_returnToken = _token;
}
/**
* Matches the ')' character. This is a top level rule, creating a
* <code>RPARENS</code> token type.
*/
public final void mRPARENS(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
int _ttype; Token _token=null; int _begin=text.length();
_ttype = RPARENS;
int _saveIndex;
match(')');
if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
_token = makeToken(_ttype);
_token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
}
_returnToken = _token;
}
/**
* Matches the '[' character. This is a top level rule, creating a
* <code>LBRACKET</code> token type.
*/
public final void mLBRACKET(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
int _ttype; Token _token=null; int _begin=text.length();
_ttype = LBRACKET;
int _saveIndex;
match('[');
if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
_token = makeToken(_ttype);
_token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
}
_returnToken = _token;
}
/**
* Matches the ']' character. This is a top level rule, creating a
* <code>RBRACKET</code> token type.
*/
public final void mRBRACKET(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
int _ttype; Token _token=null; int _begin=text.length();
_ttype = RBRACKET;
int _saveIndex;
match(']');
if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
_token = makeToken(_ttype);
_token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
}
_returnToken = _token;
}
/**
* Matches the '*' character. This is a top level rule, creating a
* <code>MULTIPLY</code> token type.
*/
public final void mMULTIPLY(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
int _ttype; Token _token=null; int _begin=text.length();
_ttype = MULTIPLY;
int _saveIndex;
match('*');
if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
_token = makeToken(_ttype);
_token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
}
_returnToken = _token;
}
/**
* Matches the '@' character. This is a top level rule, creating an
* <code>AT</code> token type.
*/
public final void mAT(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
int _ttype; Token _token=null; int _begin=text.length();
_ttype = AT;
int _saveIndex;
match('@');
if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
_token = makeToken(_ttype);
_token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
}
_returnToken = _token;
}
/**
* Matches the '^' character. This is a top level rule, creating an
* <code>CARET</code> token type.
*/
public final void mCARET(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
int _ttype; Token _token=null; int _begin=text.length();
_ttype = CARET;
int _saveIndex;
match('^');
if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
_token = makeToken(_ttype);
_token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
}
_returnToken = _token;
}
/**
* Matches the unknown value '?'. This is a top level rule, creating a
* <code>UNKNOWN_VAL</code> token type.
*/
public final void mUNKNOWN_VAL(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
int _ttype; Token _token=null; int _begin=text.length();
_ttype = UNKNOWN_VAL;
int _saveIndex;
match('?');
if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
_token = makeToken(_ttype);
_token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
}
_returnToken = _token;
}
/**
* Matches all forms of valid integer literals, decimal literals and due to
* ambiguity, the period character (<code>DOT</code> token), all date
* literals, the minus sign (<code>MINUS</code> token), the plus sign
* (<code>PLUS</code>) and all <code>FILENAME</code> tokens that begin with
* '.' or '..' must be matched here as well.
* <p>
* This is a very special method that encapsulates and resolves all ambiguity
* caused by the different usage of '.' as a decimal point and also as a
* statement separator. Likewise it handles the ambiguity presented by the
* traditional minus/plus operators and the prefixing/postfixing of a
* negative or positive sign on a numeric or decimal literal. Finally, it
* also handles the ambiguity associated with the use of '-' as a separator
* in a date literal.
* <p>
* Scenarios that are matched:
* <ul>
* <li> Matches the '.' character creating a <code>DOT</code> token type.
* <li> Matches the following strings as a <code>FILENAME</code> token
* type (the following {@link #mSYMBOL} is optional) :
* <ul>
* <li> './' <code>mSYMBOL</code>
* <li> '../' <code>mSYMBOL</code>
* <li> '.\' <code>mSYMBOL</code>
* <li> '..\' <code>mSYMBOL</code>
* </ul>
* <li> Matches the '-' character creating a <code>MINUS</code> token type
* (if this is not followed by digits or a decimal point and digits).
* <li> Matches the '-' character followed by digits as a
* <code>NUM_LITERAL</code>.
* <li> Matches the '-' character followed by digits and then a '.' and
* more digits as a <code>DEC_LITERAL</code>.
* <li> Matches the '-' character followed by a '.' and digits as a
* <code>DEC_LITERAL</code> token type.
* <li> Matches the '+' character creating a <code>PLUS</code> token type
* (if this is not followed by digits or a decimal point and digits).
* <li> Matches the '+' character followed by digits as a
* <code>NUM_LITERAL</code>. The '+' is discarded as syntactic sugar.
* <li> Matches the '+' character followed by digits and then a '.' and
* more digits as a <code>DEC_LITERAL</code>. The '+' is discarded as
* syntactic sugar.
* <li> Matches the '+' character followed by a '.' and digits as a
* <code>DEC_LITERAL</code> token type. The '+' is discarded as
* syntactic sugar.
* <li> Matches a sequence of one or more digits (without a decimal point
* and additional digits) as an integer literal with a
* <code>NUM_LITERAL</code> token type. There can be an optional
* leading negative/positive sign (the cases noted above). If no
* leading sign is present, then an optional postfixed sign (negative
* or positive) can be present.
* <li> Matches a sequence of one or more digits followed by a '.' but
* no additional digits, as an integer literal (it does not consume
* the following '.' in this case), with a <code>NUM_LITERAL</code>
* token type. There can be an optional leading negative/positive
* sign (the cases noted above).
* <li> Matches one or more numeric digits followed by a decimal point
* and another sequence of numeric digits as a decimal constant
* with a <code>DEC_LITERAL</code> token type. There can be an
* optional leading negative/positive sign (the cases noted above).
* If no leading sign is present, then an optional postfixed sign
* (negative or positive) can be present.
* <li> Matches a decimal point followed by a sequence of numeric digits
* as a decimal constant with a <code>DEC_LITERAL</code> token type.
* There can be an optional leading negative/positive sign (the cases
* noted above). If no leading sign is present, then an optional
* postfixed sign (negative or positive) can be present.
* <li> Matches digits followed by a '-', '/' or '.' and one or two digits
* as a <code>DATE_LITERAL</code>. If there are no following
* digits after the separator, then it is not matched as a date,
* instead it is a integer literal followed by an operator. The
* second separator for the year portion is optional, as is the year
* itself and there is an optional negative sign for BC dates. The
* second separator can also be any of the '-', '/' or '.' characters
* and the first and second separators can be any combination of
* these characters (the two separators don't have to be the same
* character in a single date literal).
* </ul>
* <p>
* The key to this rule is that there cannot be any intervening whitespace
* between digits and decimal points or between digits and the date separators
* '-' or '/'. Likewise, there cannot be any intervening whitespace between
* a leading or trailing '-' or '+' and the numeric or decimal literal it
* precedes or follows respectively. In such a case the '-' is lexed as a
* <code>MINUS</code> token, the '+' is lexed as a <code>PLUS</code> token
* and the parser must use context to determine if it is a unary or binary
* operator.
* <p>
* By handling the case of '.' (by itself) here instead of in a (more
* intuitive) dedicated top level rule, the ambiguity between decimal literals
* and the standalone dot can be properly managed. This is also true of the
* '-' processing which would be easier and more intuitive in a top level
* rule, but which needs to be here to resolve ambiguity.
* <p>
* In the case of a decimal with no digits on the right side of the decimal
* point, this is always interpreted as an integer literal AND a subsequent
* 2nd token of a <code>DOT</code>. This oddity cannot be easily resolved
* BUT interestingly enough this is <b>exactly</b> how Progress itself
* handles this situation AND this is a perfectly valid match since it
* essentially is an integer.
* <p>
* Date literals are generally matched in mm/dd/yyyy or mm-dd-yyyy formats,
* although the '-' and '/' separators can even be mixed in the same literal
* (mm-dd/yyyy or mm/dd-yyyy). Both months and days can be specified in 1 or
* 2 digits (actually this rule matches any number of digits for months).
* Either separator character can be used, although in Progress one cannot
* use the '-' between the mm and dd if the constant is being used in an
* expression. This lexer has no such limitation. In Progress the month
* must be an integer between 1 and 12 but this limit is not implemented
* here. In Progress the day must be between 1 and the number of days in that
* month, though this limit is not implemented here. The second separator and
* the year digits are optional. There can be an optional negative sign
* preceding any year digits and one can specify a dd and yyyy separator
* without specifying any year digits at all. Any number of year digits are
* valid, though in Progress the year 0 is treated specially, as follows:
* <ul>
* <li> Valid (all resolve to the year 2000)
* <ul>
* <li> 0
* <li> -0
* <li> 00
* </ul>
* <li> Invalid (all complain about specifying the year 0)
* <ul>
* <li> 000
* <li> 0000
* <li> 00000 (and so on...)
* <li> -00
* <li> -000 (and so on...)
* </ul>
* </ul>
* <p>
* So y, yy, yyy, yyyy, yyyyy... and -y, -yy, -yyy, -yyyy... all are valid
* year specifications, except for the specific year zero issue noted above.
* These limitations on how the year digits work are not implemented here.
* Over all, this rule supports a superset of the possible date literal
* formats in Progress and no checking of the values is done.
* <p>
* WARNING: at this time there is no support for a quirk of Progress date
* literals in which constructs like 1/1--- are valid dates equivalent
* to 01/01/00.
* <p>
* This is a top level rule. The token type defaults to
* <code>NUM_LITERAL</code> and is overridden by specific actions depending
* on the scenario matched.
*/
public final void mNUM_LITERAL(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
int _ttype; Token _token=null; int _begin=text.length();
_ttype = NUM_LITERAL;
int _saveIndex;
int ntype = NUM_LITERAL;
int digs = 0;
boolean sign = false;
boolean wasYr = false;
{
if ((((LA(1) >= '0' && LA(1) <= '9')) && ((LA(2) >= '0' && LA(2) <= '9')) && ((LA(3) >= '0' && LA(3) <= '9')) && ((LA(4) >= '0' && LA(4) <= '9')))&&(
(LA(1) >= '0' && LA(1) <= '9') &&
(LA(2) >= '0' && LA(2) <= '9') &&
(LA(3) >= '0' && LA(3) <= '9') &&
(LA(4) >= '0' && LA(4) <= '9') &&
LA(5) == '-' &&
(LA(6) >= '0' && LA(6) <= '9') &&
(LA(7) >= '0' && LA(7) <= '9') &&
LA(8) == '-' &&
(LA(9) >= '0' && LA(9) <= '9') &&
(LA(10) >= '0' && LA(10) <= '9') &&
(LA(11) == 't' || LA(11) == 'T') &&
(LA(12) >= '0' && LA(12) <= '9') &&
(LA(13) >= '0' && LA(13) <= '9') &&
LA(14) == ':' &&
(LA(15) >= '0' && LA(15) <= '9') &&
(LA(16) >= '0' && LA(16) <= '9')
)) {
mDIGIT(false);
mDIGIT(false);
mDIGIT(false);
mDIGIT(false);
match('-');
mDIGIT(false);
mDIGIT(false);
match('-');
mDIGIT(false);
mDIGIT(false);
match('t');
mDIGIT(false);
mDIGIT(false);
match(':');
mDIGIT(false);
{
if (((LA(1) >= '0' && LA(1) <= '9'))) {
mDIGIT(false);
}
else {
}
}
{
if ((LA(1)==':')) {
match(':');
mDIGIT(false);
{
if (((LA(1) >= '0' && LA(1) <= '9'))) {
mDIGIT(false);
}
else {
}
}
{
if (((LA(1)=='.'))&&( LA(1) >= '.' && LA(2) >= '0' && LA(2) <= '9' )) {
{
match('.');
{
int _cnt1889=0;
_loop1889:
do {
if (((LA(1) >= '0' && LA(1) <= '9'))) {
mDIGIT(false);
}
else {
if ( _cnt1889>=1 ) { break _loop1889; } else {throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());}
}
_cnt1889++;
} while (true);
}
}
}
else {
}
}
}
else {
}
}
ntype = DATETIME_LITERAL;
{
if (((LA(1)=='+'||LA(1)=='-'))&&(
(LA(1) == '+' || LA(1) == '-') &&
(LA(2) >= '0' && LA(2) <= '9')
)) {
{
{
switch ( LA(1)) {
case '+':
{
match('+');
break;
}
case '-':
{
match('-');
break;
}
default:
{
throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());
}
}
}
mDIGIT(false);
{
if (((LA(1) >= '0' && LA(1) <= '9'))) {
mDIGIT(false);
}
else {
}
}
{
if ((LA(1)==':')) {
match(':');
mDIGIT(false);
{
if (((LA(1) >= '0' && LA(1) <= '9'))) {
mDIGIT(false);
}
else {
}
}
}
else {
}
}
ntype = DATETIME_TZ_LITERAL;
}
}
else {
}
}
}
else if (((LA(1)=='.') && (LA(2)=='.') && (LA(3)=='/'))&&( LA(4) != '*' )) {
match("../");
{
if ((_tokenSet_0.member(LA(1)))) {
mSYMBOL(false);
}
else {
}
}
ntype = FILENAME;
}
else if ((LA(1)=='.') && (LA(2)=='.') && (LA(3)=='\\')) {
match("..\\");
{
if ((_tokenSet_0.member(LA(1)))) {
mSYMBOL(false);
}
else {
}
}
ntype = FILENAME;
}
else if ((LA(1)=='.') && ((LA(2) >= '0' && LA(2) <= '9'))) {
match('.');
{
int _cnt1874=0;
_loop1874:
do {
if (((LA(1) >= '0' && LA(1) <= '9'))) {
mDIGIT(false);
}
else {
if ( _cnt1874>=1 ) { break _loop1874; } else {throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());}
}
_cnt1874++;
} while (true);
}
{
switch ( LA(1)) {
case '-':
{
match('-');
break;
}
case '+':
{
_saveIndex=text.length();
match('+');
text.setLength(_saveIndex);
break;
}
default:
{
}
}
}
ntype = DEC_LITERAL;
}
else if (((LA(1)=='.') && (LA(2)=='/'))&&( LA(3) != '*' )) {
match("./");
{
if ((_tokenSet_0.member(LA(1)))) {
mSYMBOL(false);
}
else {
}
}
ntype = FILENAME;
}
else if ((LA(1)=='.') && (LA(2)=='\\')) {
match(".\\");
{
if ((_tokenSet_0.member(LA(1)))) {
mSYMBOL(false);
}
else {
}
}
ntype = FILENAME;
}
else if (((LA(1)=='-'||LA(1)=='0') && (LA(2)=='0'||LA(2)=='x') && (true) && (true))&&(
(LA(1) == '0' && LA(2) == 'x') ||
(LA(1) == '-' && LA(2) == '0' && LA(3) == 'x')
)) {
{
switch ( LA(1)) {
case '-':
{
match('-');
break;
}
case '0':
{
break;
}
default:
{
throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());
}
}
}
match('0');
match('x');
ntype = HEX_LITERAL;
{
_loop1882:
do {
if ((_tokenSet_10.member(LA(1)))) {
mHEX_DIGIT(false);
}
else {
break _loop1882;
}
} while (true);
}
}
else if ((LA(1)=='+') && ((LA(2) >= '0' && LA(2) <= '9'))) {
_saveIndex=text.length();
match('+');
text.setLength(_saveIndex);
{
int _cnt1897=0;
_loop1897:
do {
if (((LA(1) >= '0' && LA(1) <= '9'))) {
mDIGIT(false);
}
else {
if ( _cnt1897>=1 ) { break _loop1897; } else {throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());}
}
_cnt1897++;
} while (true);
}
{
if (((LA(1)=='.'))&&( (LA(2) >= '0' && LA(2) <= '9') )) {
match('.');
{
int _cnt1900=0;
_loop1900:
do {
if (((LA(1) >= '0' && LA(1) <= '9'))) {
mDIGIT(false);
}
else {
if ( _cnt1900>=1 ) { break _loop1900; } else {throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());}
}
_cnt1900++;
} while (true);
}
ntype = DEC_LITERAL;
}
else {
}
}
}
else if ((LA(1)=='.') && (true)) {
match('.');
ntype = DOT;
}
else if (((_tokenSet_11.member(LA(1))) && (true) && (true) && (true))&&(
(LA(1) >= '0' && LA(1) <= '9') ||
(LA(1) == '-' && (LA(2) >= '0' && LA(2) <= '9'))
)) {
{
switch ( LA(1)) {
case '-':
{
match('-');
sign = true;
break;
}
case '0': case '1': case '2': case '3':
case '4': case '5': case '6': case '7':
case '8': case '9':
{
break;
}
default:
{
throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());
}
}
}
{
int _cnt1903=0;
_loop1903:
do {
if (((LA(1) >= '0' && LA(1) <= '9'))) {
mDIGIT(false);
}
else {
if ( _cnt1903>=1 ) { break _loop1903; } else {throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());}
}
_cnt1903++;
} while (true);
}
{
if (((LA(1)=='-'||LA(1)=='/') && ((LA(2) >= '0' && LA(2) <= '9')))&&( (LA(2) >= '0' && LA(2) <= '9') )) {
{
switch ( LA(1)) {
case '/':
{
match('/');
break;
}
case '-':
{
match('-');
break;
}
default:
{
throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());
}
}
}
mDIGIT(false);
{
if (((LA(1) >= '0' && LA(1) <= '9'))) {
mDIGIT(false);
}
else {
}
}
{
if (((LA(1)=='-'||LA(1)=='/') && (LA(2)=='.'||LA(2)=='/'))&&( LA(1) != '-' || LA(2) == '/' )) {
mMONTH_TRASH_MODE(false);
}
else if ((((LA(1) >= '-' && LA(1) <= '/')) && (true))&&(
LA(1) != '.' ||
(LA(2) == '-' || (LA(2) >= '0' && LA(2) <= '9'))
)) {
{
switch ( LA(1)) {
case '/':
{
match('/');
break;
}
case '-':
{
match('-');
break;
}
case '.':
{
match('.');
break;
}
default:
{
throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());
}
}
}
{
if ((LA(1)=='-')) {
match('-');
}
else {
}
}
{
if (((LA(1) >= '0' && LA(1) <= '9'))) {
{
int _cnt1922=0;
_loop1922:
do {
if (((LA(1) >= '0' && LA(1) <= '9'))) {
mDIGIT(false);
ntype = DATE_LITERAL;
}
else {
if ( _cnt1922>=1 ) { break _loop1922; } else {throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());}
}
_cnt1922++;
} while (true);
}
{
if ((LA(1)=='-'||LA(1)=='/')) {
mYEAR_TRASH_MODE(false);
}
else {
}
}
}
else {
}
}
}
else {
}
}
ntype = DATE_LITERAL;
}
else if (((LA(1)=='.'))&&( (LA(2) >= '0' && LA(2) <= '9') )) {
match('.');
{
int _cnt1906=0;
_loop1906:
do {
if (((LA(1) >= '0' && LA(1) <= '9'))) {
mDIGIT(false);
digs++;
}
else {
if ( _cnt1906>=1 ) { break _loop1906; } else {throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());}
}
_cnt1906++;
} while (true);
}
ntype = DEC_LITERAL;
{
if (((LA(1)=='-'||LA(1)=='/') && (LA(2)=='.'||LA(2)=='/'))&&( LA(1) != '-' || LA(2) == '/' )) {
mMONTH_TRASH_MODE(false);
ntype = DATE_LITERAL;
}
else if ((((LA(1) >= '-' && LA(1) <= '/')) && (true) && (true) && (true))&&(
digs < 3 &&
(LA(1) != '.' ||
(LA(2) == '-' || (LA(2) >= '0' && LA(2) <= '9')))
)) {
{
switch ( LA(1)) {
case '/':
{
match('/');
ntype = DATE_LITERAL;
break;
}
case '-':
{
match('-');
ntype = DEC_LITERAL;
break;
}
case '.':
{
match('.');
ntype = DATE_LITERAL;
break;
}
default:
{
throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());
}
}
}
{
if ((LA(1)=='-')) {
match('-');
}
else {
}
}
{
if (((LA(1) >= '0' && LA(1) <= '9'))) {
{
int _cnt1912=0;
_loop1912:
do {
if (((LA(1) >= '0' && LA(1) <= '9'))) {
mDIGIT(false);
ntype = DATE_LITERAL;
}
else {
if ( _cnt1912>=1 ) { break _loop1912; } else {throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());}
}
_cnt1912++;
} while (true);
}
{
if ((LA(1)=='-'||LA(1)=='/')) {
mYEAR_TRASH_MODE(false);
}
else {
}
}
}
else {
}
}
}
else if ((LA(1)=='+'||LA(1)=='-') && (true) && (true) && (true)) {
{
switch ( LA(1)) {
case '-':
{
match('-');
break;
}
case '+':
{
match('+');
break;
}
default:
{
throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());
}
}
}
}
else {
}
}
}
else if (((LA(1)=='+'||LA(1)=='-') && (true))&&( !sign )) {
{
switch ( LA(1)) {
case '-':
{
match('-');
break;
}
case '+':
{
match('+');
break;
}
default:
{
throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());
}
}
}
}
else {
}
}
}
else if ((LA(1)=='+'||LA(1)=='-') && (true) && (true) && (true)) {
{
switch ( LA(1)) {
case '-':
{
match('-');
ntype = MINUS;
break;
}
case '+':
{
match('+');
ntype = PLUS;
break;
}
default:
{
throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());
}
}
}
{
if (((LA(1)=='.'))&&( (LA(2) >= '0' && LA(2) <= '9') )) {
match('.');
{
int _cnt1928=0;
_loop1928:
do {
if (((LA(1) >= '0' && LA(1) <= '9'))) {
mDIGIT(false);
}
else {
if ( _cnt1928>=1 ) { break _loop1928; } else {throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());}
}
_cnt1928++;
} while (true);
}
ntype = DEC_LITERAL;
}
else if (((LA(1)=='-'))&&( ntype == MINUS )) {
{
int _cnt1930=0;
_loop1930:
do {
if ((LA(1)=='-')) {
match('-');
}
else {
if ( _cnt1930>=1 ) { break _loop1930; } else {throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());}
}
_cnt1930++;
} while (true);
}
ntype = UNQUOTED_TEXT;
}
else if (((LA(1)=='+'))&&( ntype == PLUS )) {
{
int _cnt1932=0;
_loop1932:
do {
if ((LA(1)=='+')) {
match('+');
}
else {
if ( _cnt1932>=1 ) { break _loop1932; } else {throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());}
}
_cnt1932++;
} while (true);
}
ntype = UNQUOTED_TEXT;
}
else {
}
}
}
else {
throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());
}
}
// post-processing for hex literals
if (ntype == HEX_LITERAL)
{
String hex = getText();
int min = (hex.charAt(0) == '-') ? 3 : 2;
int len = hex.length();
// special case where the x is ignored, the result is the same as num_literal == 0
if (len == min)
{
setText("0");
ntype = NUM_LITERAL;
}
// too large, this is invalid 4GL code
if (len > (min + 16))
{
// TODO: do something here to raise an error
}
}
// this is a case where we can't drop the '+' until after we know it
// is part of a decimal literal, since it might just be a plus sign
if (ntype == DEC_LITERAL)
{
String txt = getText();
if (txt.charAt(0) == '+')
{
// get rid of the useless unary plus
setText(txt.substring(1));
}
}
_ttype = ntype;
if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
_token = makeToken(_ttype);
_token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
}
_returnToken = _token;
}
/**
* Matches any numeric digit: <code>0 - 9</code>.
*/
protected final void mDIGIT(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
int _ttype; Token _token=null; int _begin=text.length();
_ttype = DIGIT;
int _saveIndex;
matchRange('0','9');
if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
_token = makeToken(_ttype);
_token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
}
_returnToken = _token;
}
/**
* Matches any single character that can match a hexadecimal digit. Internally, it uses the
* <code>LETTER</code> and <code>DIGIT</code> rules. This is simply a helper rule to make
* references easier.
*/
protected final void mHEX_DIGIT(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
int _ttype; Token _token=null; int _begin=text.length();
_ttype = HEX_DIGIT;
int _saveIndex;
switch ( LA(1)) {
case 'a': case 'b': case 'c': case 'd':
case 'e': case 'f':
{
matchRange('a','f');
break;
}
case '0': case '1': case '2': case '3':
case '4': case '5': case '6': case '7':
case '8': case '9':
{
mDIGIT(false);
break;
}
default:
{
throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());
}
}
if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
_token = makeToken(_ttype);
_token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
}
_returnToken = _token;
}
/**
* Trash (of arbitrary length) that can be matched after the month at the end of a date literal.
*/
protected final void mMONTH_TRASH_MODE(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
int _ttype; Token _token=null; int _begin=text.length();
_ttype = MONTH_TRASH_MODE;
int _saveIndex;
{
if ((LA(1)=='/') && (LA(2)=='/')) {
match("//");
}
else if ((LA(1)=='/') && (LA(2)=='.')) {
match("/.");
}
else if ((LA(1)=='-')) {
match("-/");
}
else {
throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());
}
}
{
_loop1993:
do {
switch ( LA(1)) {
case '0': case '1': case '2': case '3':
case '4': case '5': case '6': case '7':
case '8': case '9':
{
mDIGIT(false);
break;
}
case '/':
{
match('/');
break;
}
case '-':
{
match('-');
break;
}
default:
if (((LA(1)=='.'))&&( LA(2) >= '0' && LA(2) <= '9' )) {
match('.');
}
else {
break _loop1993;
}
}
} while (true);
}
if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
_token = makeToken(_ttype);
_token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
}
_returnToken = _token;
}
/**
* Trash (of arbitrary length) that can be matched after a valid year at the end of a date literal.
*/
protected final void mYEAR_TRASH_MODE(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
int _ttype; Token _token=null; int _begin=text.length();
_ttype = YEAR_TRASH_MODE;
int _saveIndex;
{
switch ( LA(1)) {
case '/':
{
match("/");
break;
}
case '-':
{
match("-");
break;
}
default:
{
throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());
}
}
}
{
_loop1997:
do {
switch ( LA(1)) {
case '0': case '1': case '2': case '3':
case '4': case '5': case '6': case '7':
case '8': case '9':
{
mDIGIT(false);
break;
}
case '/':
{
match('/');
break;
}
case '-':
{
match('-');
break;
}
default:
if (((LA(1)=='.'))&&( LA(2) >= '0' && LA(2) <= '9' )) {
match('.');
}
else {
break _loop1997;
}
}
} while (true);
}
if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
_token = makeToken(_ttype);
_token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
}
_returnToken = _token;
}
/**
* Matches other unexpected characters and generates a token rather than throwing an exception
* (this rule must be changed when matched characters are moved to another top level rule). Note
* that this rule is designed to match the unusual characters that can't be normally used in a
* Progress 4GL source program, but might appear in a command token list for a shell command that
* is embedded in a procedure. These characters can also be seen in malformed symbols
* (e.g. frame/stream/query... names), but not in regular symbols (var and field names). Likewise
* the other control characters (other than whitespace) are not matched. The list of matched
* characters:
* <p>
* <pre>
* '`'
* '!'
* '#'
* '$'
* '%'
* '&'
* '{'
* '}'
* '|'
* ';'
* '\u0080' through '\ufffe' (all UNICODE characters starting in the extended ASCII range and above)
* </pre>
* <p>
* Anything that is not matched here will still trigger an exception. Note that ANTLR's filter
* feature seems to be a better approach to resolve this problem (of wanting to generate an
* <code>UNKNOWN_TOKEN</code> rather than throw an exception), however it can only handle the
* consumption of such characters. The filter rule that is called when there is no top level
* match cannot generate tokens because of the way that <code>nextToken</code> is generated by
* ANTLR. Such filters are not allowed to generate a token so this less-optimal approach of
* specifying the special characters in advance is the result.
*/
public final void mUNKNOWN_TOKEN(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
int _ttype; Token _token=null; int _begin=text.length();
_ttype = UNKNOWN_TOKEN;
int _saveIndex;
switch ( LA(1)) {
case '`':
{
match('`');
break;
}
case '!':
{
match('!');
break;
}
case '#':
{
match('#');
break;
}
case '$':
{
match('$');
break;
}
case '%':
{
match('%');
break;
}
case '&':
{
match('&');
break;
}
case '{':
{
match('{');
break;
}
case '}':
{
match('}');
break;
}
case '|':
{
match('|');
break;
}
case ';':
{
match(';');
break;
}
default:
if (((LA(1) >= '\u0080' && LA(1) <= '\ufffe'))) {
matchRange('\u0080','\ufffe');
}
else {
throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());
}
}
if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
_token = makeToken(_ttype);
_token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
}
_returnToken = _token;
}
/**
* Matches all characters that can be made part of a valid user-defined
* symbol (except alphabetic and numeric characters):
* <code> # $ % & - _ </code>
*/
protected final void mSYM_CHAR(boolean _createToken) throws RecognitionException, CharStreamException, TokenStreamException {
int _ttype; Token _token=null; int _begin=text.length();
_ttype = SYM_CHAR;
int _saveIndex;
switch ( LA(1)) {
case '#':
{
match('#');
break;
}
case '$':
{
match('$');
break;
}
case '%':
{
match('%');
break;
}
case '&':
{
match('&');
break;
}
case '-':
{
match('-');
break;
}
case '_':
{
match('_');
break;
}
default:
{
throw new NoViableAltForCharException((char)LA(1), getFilename(), getLine(), getColumn());
}
}
if ( _createToken && _token==null && _ttype!=Token.SKIP ) {
_token = makeToken(_ttype);
_token.setText(new String(text.getBuffer(), _begin, text.length()-_begin));
}
_returnToken = _token;
}
private static final long[] mk_tokenSet_0() {
long[] data = new long[1025];
data[0]=140737488355328L;
data[1]=576460746129408000L;
return data;
}
public static final BitSet _tokenSet_0 = new BitSet(mk_tokenSet_0());
private static final long[] mk_tokenSet_1() {
long[] data = new long[1025];
data[0]=288063250384289792L;
return data;
}
public static final BitSet _tokenSet_1 = new BitSet(mk_tokenSet_1());
private static final long[] mk_tokenSet_2() {
long[] data = new long[3072];
data[0]=576461276289433600L;
data[1]=4035225270418931712L;
for (int i = 2; i<=1022; i++) { data[i]=-1L; }
data[1023]=9223372036854775807L;
return data;
}
public static final BitSet _tokenSet_2 = new BitSet(mk_tokenSet_2());
private static final long[] mk_tokenSet_3() {
long[] data = new long[2048];
data[0]=-17179869185L;
for (int i = 1; i<=1022; i++) { data[i]=-1L; }
data[1023]=9223372036854775807L;
return data;
}
public static final BitSet _tokenSet_3 = new BitSet(mk_tokenSet_3());
private static final long[] mk_tokenSet_4() {
long[] data = new long[2048];
data[0]=-17179870209L;
for (int i = 1; i<=1022; i++) { data[i]=-1L; }
data[1023]=9223372036854775807L;
return data;
}
public static final BitSet _tokenSet_4 = new BitSet(mk_tokenSet_4());
private static final long[] mk_tokenSet_5() {
long[] data = new long[2048];
data[0]=-549755823105L;
data[1]=-4611686018695823361L;
for (int i = 2; i<=1022; i++) { data[i]=-1L; }
data[1023]=9223372036854775807L;
return data;
}
public static final BitSet _tokenSet_5 = new BitSet(mk_tokenSet_5());
private static final long[] mk_tokenSet_6() {
long[] data = new long[2048];
data[0]=-17179878401L;
data[1]=-4611686018695823361L;
for (int i = 2; i<=1022; i++) { data[i]=-1L; }
data[1023]=9223372036854775807L;
return data;
}
public static final BitSet _tokenSet_6 = new BitSet(mk_tokenSet_6());
private static final long[] mk_tokenSet_7() {
long[] data = new long[1025];
data[1]=5647126079995904L;
return data;
}
public static final BitSet _tokenSet_7 = new BitSet(mk_tokenSet_7());
private static final long[] mk_tokenSet_8() {
long[] data = new long[1025];
data[0]=287984600943165440L;
data[1]=576460745860972544L;
return data;
}
public static final BitSet _tokenSet_8 = new BitSet(mk_tokenSet_8());
private static final long[] mk_tokenSet_9() {
long[] data = new long[2048];
data[0]=-9217L;
for (int i = 1; i<=1022; i++) { data[i]=-1L; }
data[1023]=9223372036854775807L;
return data;
}
public static final BitSet _tokenSet_9 = new BitSet(mk_tokenSet_9());
private static final long[] mk_tokenSet_10() {
long[] data = new long[1025];
data[0]=287948901175001088L;
data[1]=541165879296L;
return data;
}
public static final BitSet _tokenSet_10 = new BitSet(mk_tokenSet_10());
private static final long[] mk_tokenSet_11() {
long[] data = new long[1025];
data[0]=287984085547089920L;
return data;
}
public static final BitSet _tokenSet_11 = new BitSet(mk_tokenSet_11());
}