Proparse Tree Specification


/*

JPTreeParser.g - Primary tree parser.

Joanju Proparse Syntax Tree Structure Specification

Copyright (c) 2001-2002 Joanju Limited. All rights reserved.


This tree parser has no actions. It is the basis for creating new
tree parsers.


Notes:
	- Token types always start with a capital letter
	- functions always start with a lowercase letter
	- ALLCAPS is by convention the name for a real token type
	- Mixed_case is by convention the name for a synthetic node's token type
	- This: #(
	  means that the first node is root, the rest are children of that root.
	- the pipe symbol "|" represents logical OR, of course
	- "something" is optional: (something)?
	- "something" must be present one or more times: (something)+
	- "something" may be there zero, one, or many times: (something)*
	- A period represents a token of any type.

*/


header {
	package com.joanju.treeparserbase;

	import com.joanju.ProparseLdr;
	import com.joanju.proparse.JPNode;
}



options {
	language = "Java";
}



// Class preamble - this gets inserted near the top of the .java file.
{
} // Class preamble



// class definition options for Antlr
class JPTreeParser extends TreeParser;
options {
	importVocab = ProParser;
	defaultErrorHandler = false;
	classHeaderSuffix = IJPTreeParser;
}



// This is added to top of the class definitions
{

	private ProparseLdr parser = ProparseLdr.getInstance();

	// Where did the tree parser leave off parsing -- might give us at least a bit
	// of an idea where things left off if an exception was thrown.
	// See antlr/TreeParser and the generated code.
	public JPNode get_retTree() {
		return (JPNode)_retTree;
	}

	// Func for grabbing the "state2" attribute from the node at LT(1) 
	private boolean state2(AST node, String match) {
		return parser.attrGetS(((JPNode)node).getHandle(), "state2").equals(match);
	}

}



///////////////////////////////////////////////////////////////////////////////////////////////////
// Begin grammar
///////////////////////////////////////////////////////////////////////////////////////////////////


program
	:	#(Program_root (blockorstate)* Program_tail)
	;

code_block
	:	#(Code_block (blockorstate)* )
	;

blockorstate
	:	(	labeled_block
		|	statement
		|	// Expr_statement has a "statehead" node attribute
			#(Expr_statement expression (NOERROR_KW)? state_end)
		|	PROPARSEDIRECTIVE
		|	PERIOD
		)
	;

labeled_block
	:	#(BLOCK_LABEL LEXCOLON (dostate|forstate|repeatstate) )
	;


block_colon
	:	LEXCOLON | PERIOD
	;
block_end
	:	EOF
	|	END state_end
	;
block_for
	:	#(FOR RECORD_NAME (COMMA RECORD_NAME)* )
	;
block_opt
	:	#(Block_iterator field EQUAL expression TO expression (BY constant)? )
	|	querytuningphrase 
	|	#(WHILE expression )
	|	TRANSACTION 
	|	on___phrase 
	|	framephrase 
	|	BREAK
	|	#(BY expression (DESCENDING)? )
	|	#(GROUP ( #(BY expression (DESCENDING)? ) )+ )
	;
block_preselect
	:	#(PRESELECT for_record_spec )
	;

pseudfn
	:	AAMSG
	|	currentlanguagefunc
	|	currentvaluefunc
	|	CURRENTWINDOW
	|	entryfunc
	|	framevaluefunc
	|	lengthfunc
	|	nextvaluefunc
	|	overlay_pseudfn
	|	promsgsfunc
	|	propathfunc
	|	putbits_pseudfn
	|	putbyte_pseudfn
	|	putbytes_pseudfn
	|	putdouble_pseudfn
	|	putfloat_pseudfn
	|	putlong_pseudfn
	|	putshort_pseudfn
	|	putstring_pseudfn
	|	putunsignedshort_pseudfn
	|	rawfunc
	|	setbyteorder_pseudfn
	|	setpointervalue_pseudfn
	|	setsize_pseudfn
	|	substringfunc
	|	terminalfunc
	|	widattr
	;


statement
// All statement first nodes have a node attribute of "statehead".
// Additionally, for those first statement nodes which are ambiguous
// (ex: CREATE), there is an additional disambiguating attribute of "state2".
	:						aatracestatement
	|						accumulatestate
 	|						altertablestate
 	|						analyzestate
	|						applystate
	|						assignstate
	|						bellstate
	|						buffercomparestate
	|						buffercopystate
	|						callstate
	|						casestate
	|						choosestate
	|						clearstate
	|	{state2(_t, "")}?			closestate			// SQL
	|	{state2(_t, "QUERY")}?			closequerystate
	|	{state2(_t, "STOREDPROCEDURE")}?	closestoredprocedurestate
	|						colorstate
	|						compilestate
	|						connectstate  
	|	{state2(_t, "")}?			createstate
	|	{state2(_t, "ALIAS")}?			createaliasstate
	|	{state2(_t, "Automationobject")}?	createautomationobjectstate
	|	{state2(_t, "BROWSE")}?			createbrowsestate
	|	{state2(_t, "BUFFER")}?			createbufferstate
	|	{state2(_t, "CALL")}?			createcallstate
	|	{state2(_t, "DATABASE")}?		createdatabasestate
	|	{state2(_t, "INDEX")}?			createindexstate		// SQL
	|	{state2(_t, "QUERY")}?			createquerystate   
	|	{state2(_t, "SAXREADER")}?		createsaxreaderstate
	|	{state2(_t, "SERVER")}?			createserverstate
	|	{state2(_t, "SERVERSOCKET")}?		createserversocketstate
	|	{state2(_t, "SOCKET")}?			createsocketstate
	|	{state2(_t, "TABLE")}?			createtablestate		// SQL
	|	{state2(_t, "TEMPTABLE")}?		createtemptablestate
	|	{state2(_t, "VIEW")}?			createviewstate			// SQL
	|	{state2(_t, "WIDGET")}?			createwidgetstate
	|	{state2(_t, "WIDGETPOOL")}?		createwidgetpoolstate
	|	{state2(_t, "XDOCUMENT")}?		createxdocumentstate
	|	{state2(_t, "XNODEREF")}?		createxnoderefstate
	|	{state2(_t, "ADVISE")}?			ddeadvisestate
	|	{state2(_t, "EXECUTE")}?		ddeexecutestate
	|	{state2(_t, "GET")}?			ddegetstate
	|	{state2(_t, "INITIATE")}?		ddeinitiatestate
	|	{state2(_t, "REQUEST")}?		dderequeststate
	|	{state2(_t, "SEND")}?			ddesendstate
	|	{state2(_t, "TERMINATE")}?		ddeterminatestate	
	|						declarecursorstate
	|	{state2(_t, "BROWSE")}?			definebrowsestate
	|	{state2(_t, "BUFFER")}?			definebufferstate
	|	{state2(_t, "BUTTON")}?			definebuttonstate
	|	{state2(_t, "FRAME")}?			defineframestate
	|	{state2(_t, "IMAGE")}?			defineimagestate
	|	{state2(_t, "MENU")}?			definemenustate
	|	{state2(_t, "PARAMETER")}?		defineparameterstate
	|	{state2(_t, "QUERY")}?			definequerystate
	|	{state2(_t, "RECTANGLE")}?		definerectanglestate
	|	{state2(_t, "STREAM")}?			definestreamstate
	|	{state2(_t, "SUBMENU")}?		definesubmenustate
	|	{state2(_t, "TEMPTABLE")}?		definetemptablestate
	|	{state2(_t, "WORKTABLE")}?		defineworktablestate
	|	{state2(_t, "VARIABLE")}?		definevariablestate
	|						dictionarystate
	|	{state2(_t, "")}?			deletestate
	|	{state2(_t, "ALIAS")}?			deletealiasstate
	|	{state2(_t, "FROM")}?			deletefromstate
	|	{state2(_t, "OBJECT")}?			deleteobjectstate
	|	{state2(_t, "PROCEDURE")}?		deleteprocedurestate
	|	{state2(_t, "WIDGET")}?			deletewidgetstate
	|	{state2(_t, "WIDGETPOOL")}?		deletewidgetpoolstate
	|	{state2(_t, "")}?			disablestate
	|	{state2(_t, "TRIGGERS")}?		disabletriggersstate
	|						disconnectstate
	|						displaystate
	|						dostate
	|						downstate
	|	{state2(_t, "INDEX")}?			dropindexstate			// SQL
	|	{state2(_t, "TABLE")}?			droptablestate			// SQL
	|	{state2(_t, "VIEW")}?			dropviewstate			// SQL
	|						emptytemptablestate  
	|						enablestate
	|						exportstate
	|						fetchstate
	|						findstate
	|						forstate
	|						formstate
	|						functionstate
	|						getstate
	|						getkeyvaluestate  
	|						grantstate
	|						hidestate
	|						ifstate
	|						importstate  
	|	{state2(_t, "CLEAR")}?			inputclearstate
	|	{state2(_t, "CLOSE")}?			inputclosestate
	|	{state2(_t, "FROM")}?			inputfromstate
	|	{state2(_t, "THROUGH")}?		inputthroughstate
	|	{state2(_t, "CLOSE")}?			inputoutputclosestate
	|	{state2(_t, "THROUGH")}?		inputoutputthroughstate
	|	{state2(_t, "INTO")}?			insertintostate			// SQL
	|	{state2(_t, "")}?			insertstate
	|						leavestate
	|						loadstate  
	|						messagestate
	|						nextstate
	|						nextpromptstate
	|						onstate  
	|	{state2(_t, "")}?			openstate			// SQL
	|	{state2(_t, "QUERY")}?			openquerystate
	|						osappendstate
	|						oscommandstate
	|						oscopystate
	|						oscreatedirstate  
	|						osdeletestate
	|						osrenamestate
	|	{state2(_t, "CLOSE")}?			outputclosestate
	|	{state2(_t, "THROUGH")}?		outputthroughstate
	|	{state2(_t, "TO")}?			outputtostate
	|						pagestate  
	|						pausestate
	|						procedurestate
	|						processeventsstate
	|						promptforstate
	|						publishstate
	|	{state2(_t, "")}?			putstate
	|	{state2(_t, "CURSOR")}?			putcursorstate
	|	{state2(_t, "SCREEN")}?			putscreenstate
	|						putkeyvaluestate
	|						quitstate
	|						rawtransferstate
	|						readkeystate
	|	{state2(_t, "")}?			releasestate
	|	{state2(_t, "EXTERNAL")}?		releaseexternalstate
	|	{state2(_t, "OBJECT")}?			releaseobjectstate
	|						repeatstate
	|						repositionstate  
	|						returnstate
	|						revokestate
	|	{state2(_t, "")}?			runstate
	|	{state2(_t, "STOREDPROCEDURE")}?	runstoredprocedurestate
	|	{state2(_t, "SUPER")}?			runsuperstate
	|						savecachestate
	|						scrollstate
	|						seekstate  
	|						selectstate
	|						setstate
	|						showstatsstate
	|						statusstate  
	|						stopstate
	|						subscribestate
	|	{state2(_t, "COLOR")}?			systemdialogcolorstate
	|	{state2(_t, "FONT")}?			systemdialogfontstate
	|	{state2(_t, "GETFILE")}?		systemdialoggetfilestate
	|	{state2(_t, "PRINTERSETUP")}?		systemdialogprintersetupstate
	|						systemhelpstate
	|						transactionmodeautomaticstate
	|						triggerprocedurestate
	|						underlinestate  
	|						undostate
	|						unloadstate
	|						unsubscribestate
	|						upstate  
	|						updatestatement
	|						usestate
	|						validatestate
	|						viewstate
	|						waitforstate
	;

functioncall
	:	aacbitfunc | aacontrolfunc | aamsgfunc | aapcontrolfunc | aaserialfunc
	|	absolutefunc | accumfunc | aliasfunc | ambiguousfunc | ascfunc 
	|	availablefunc 
	|	candofunc | canfindfunc | canqueryfunc | cansetfunc | capsfunc 
	|	chrfunc | codepageconvertfunc | collatefunc | comparefunc | connectedfunc 
	|	countoffunc | currentchangedfunc 
	|	currentlanguagefunc | currentresultrowfunc | currentvaluefunc | cursorfunc | dataserversfunc 
	|	datefunc | dayfunc | dbcodepagefunc | dbcollationfunc | dbnamefunc | dbparamfunc 
	|	dbrestrictionsfunc | dbtaskidfunc | dbtypefunc | dbversionfunc | decimalfunc 
	|	dynamicfuncfunc | encodefunc | entryfunc | etimefunc | expfunc | extentfunc 
	|	fillfunc | firstfunc | firstoffunc | framecolfunc | framedbfunc | framedownfunc 
	|	framefieldfunc | framefilefunc | frameindexfunc | framelinefunc | framenamefunc 
	|	framerowfunc | framevaluefunc | gatewaysfunc | getbitsfunc | getbytefunc 
	|	getbyteorderfunc | getbytesfunc | getcodepagesfunc | getcollationsfunc 
	|	getdoublefunc | getfloatfunc
	|	getlicensefunc
	|	getlongfunc | getpointervaluefunc | getshortfunc 
	|	getsizefunc | getstringfunc | getunsignedshortfunc | gopendingfunc | iffunc 
	|	indexfunc
	|	integerfunc | isattrspacefunc | isleadbytefunc
	|	kblabelfunc | keycodefunc | keyfuncfunc | keylabelfunc | keywordfunc 
	|	keywordallfunc | lastfunc | lastoffunc | lastkeyfunc | lcfunc | ldbnamefunc 
	|	lefttrimfunc | lengthfunc | libraryfunc | linecounterfunc | listeventsfunc 
	|	listqueryattrsfunc | listsetattrsfunc | listwidgetsfunc | loadpicturefunc 
	|	lockedfunc | logfunc |logicalfunc | lookupfunc
	|	machineclassfunc
	| 	maximumfunc | memberfunc | messagelinesfunc |	minimumfunc
	|	monthfunc | newfunc | nextvaluefunc | numaliasesfunc | numdbsfunc 
	|	numentriesfunc | numresultsfunc | opsysfunc | osdrivesfunc | oserrorfunc 
	|	osgetenvfunc | pagenumberfunc | pagesizefunc | pdbnamefunc | prochandlefunc 
	|	procstatusfunc | programnamefunc | progressfunc | promsgsfunc | propathfunc 
	|	proversionfunc | queryoffendfunc | quoterfunc | rindexfunc | randomfunc | rawfunc | recidfunc 
	|	recordlengthfunc | replacefunc | retryfunc | returnvaluefunc | rgbvaluefunc 
	|	righttrimfunc | roundfunc | rowidfunc | screenlinesfunc | sdbnamefunc | searchfunc 
	|	seekfunc | setuseridfunc
	|	sqlaggregatefunc
	|	sqrtfunc | stringfunc | substitutefunc 
	|	substringfunc | superfunc | torowidfunc | terminalfunc | timefunc | todayfunc 
	|	transactionfunc | trimfunc | truncatefunc | useridfunc | valideventfunc 
	|	validhandlefunc | weekdayfunc | widgethandlefunc | yearfunc
	;

parameter
	:	#(BUFFER (RECORD_NAME | ID FOR RECORD_NAME ) )
	|	#(PARAM expression EQUAL expression )
	|	#(OUTPUT parameter_arg )
	|	#(INPUTOUTPUT parameter_arg )
	|	#(INPUT parameter_arg )
	;
parameter_arg
	:	TABLEHANDLE field (APPEND)?
	|	TABLE (FOR)? RECORD_NAME (APPEND)?
	|	ID AS (keyword|ID)
	|	expression
	;

parameterlist
	:	#(Parameter_list parameterlist_noroot )
	;
parameterlist_noroot
	:	LEFTPAREN (parameter)? (COMMA parameter)* RIGHTPAREN
	;

eventlist
	:	#(Event_list . (COMMA .)* )
	;

funargs
	:	LEFTPAREN expression (COMMA expression)* RIGHTPAREN
	;

anyorvalue
	:	#(VALUE LEFTPAREN expression RIGHTPAREN )
	|	TYPELESS_TOKEN
	;
filenameorvalue
	:	#(VALUE LEFTPAREN expression RIGHTPAREN )
	|	FILENAME
	;
valueexpression
	:	#(VALUE LEFTPAREN expression RIGHTPAREN )
	;
expressionorvalue
	:	#(VALUE LEFTPAREN expression RIGHTPAREN )
	|	expression
	;

fieldorinline
	:	(	field
		|	ID
		)
	;

findwhich
	:	CURRENT | EACH | FIRST | LAST | NEXT | PREV
	;

lockhow
	:	SHARELOCK | EXCLUSIVELOCK | NOLOCK
	;


expression
	:	#(OR expression expression )
	|	#(AND expression expression )
	|	#(NOT expression )
	|	#(MATCHES expression expression )
	|	#(BEGINS expression expression )
	|	#(CONTAINS expression expression )
	|	#(EQ expression expression )
	|	#(NE expression expression )
	|	#(GTHAN expression expression )
	|	#(GE expression expression )
	|	#(LTHAN expression expression )
	|	#(LE expression expression )
	|	#(PLUS expression expression )
	|	#(MINUS expression expression )
	|	#(MULTIPLY expression expression )
	|	#(DIVIDE expression expression )
	|	#(MODULO expression expression )
	|	#(UNARY_MINUS exprt )
	|	#(UNARY_PLUS exprt )
	|	exprt
	;

exprt
	:	constant
	|	#(USER_FUNC parameterlist_noroot )
	|	functioncall
	|       systemhandlename
	|	widattr
	|	field
	|	#(Entered_func field (NOT)? ENTERED )
	|	#(LEFTPAREN expression RIGHTPAREN )
	|	RECORD_NAME // for DISPLAY buffername, etc.
	;

widattr
	:	#(	Widget_ref
			(NORETURNVALUE)?
			s_widget
			(OBJCOLON . (array_subscript)? (method_param_list)? )+
			(#(IN_KW (MENU|FRAME|BROWSE|SUBMENU|BUFFER) ID ))? (AS .)?
		)
	;

gwidget
	:	#(Widget_ref s_widget (#(IN_KW (MENU|FRAME|BROWSE|SUBMENU|BUFFER) ID ))? )
	;

widgetlist
	:	gwidget (COMMA gwidget)*
	;

s_widget
	:	widname	| (FIELD)? field
	;

widname
	:	systemhandlename
	|	FRAME ID
	|	MENU ID
	|	SUBMENU ID
	|	MENUITEM ID
	|	BROWSE ID
	|	QUERY ID
	|	TEMPTABLE ID
	|	BUFFER ID
	|	XDOCUMENT ID
	|	XNODEREF ID
	|	SOCKET ID
	;

field
	:	#(Field_ref (INPUT)? (#(FRAME ID) | #(BROWSE ID))? ID (array_subscript)? )
	;

array_subscript
	:	#(Array_subscript LEFTBRACE expression (FOR expression)? RIGHTBRACE )
	;

method_param_list
	:	#(Method_param_list LEFTPAREN (method_parameter)? (COMMA (method_parameter)?)* RIGHTPAREN )
	;
method_parameter
	:	#(	Method_parameter
			(OUTPUT|INPUTOUTPUT)?
			expression (AS (keyword|ID))?
			(BYPOINTER|BYVARIANTPOINTER)?
		)
	;

constant
	:	TRUE_KW | FALSE_KW | YES | NO | UNKNOWNVALUE | QSTRING | LEXDATE | NUMBER | NULL_KW 
	|	NOWAIT | SHARELOCK | EXCLUSIVELOCK | NOLOCK
	|	BIGENDIAN
	|	FINDCASESENSITIVE | FINDGLOBAL | FINDNEXTOCCURRENCE | FINDPREVOCCURRENCE | FINDSELECT | FINDWRAPAROUND
	|	HOSTBYTEORDER | LITTLEENDIAN
	|	READAVAILABLE | READEXACTNUM
	|	SEARCHSELF | SEARCHTARGET
	|	WINDOWDELAYEDMINIMIZE | WINDOWMINIMIZED | WINDOWNORMAL | WINDOWMAXIMIZED
	;


systemhandlename
	:	AAMEMORY | ACTIVEWINDOW | CLIPBOARD | CODEBASELOCATOR | COLORTABLE | COMPILER 
	|	COMSELF | CURRENTWINDOW | DEBUGGER | DEFAULTWINDOW
	|	ERRORSTATUS | FILEINFORMATION | FOCUS | FONTTABLE | LASTEVENT
	|	MOUSE | PROFILER | RCODEINFORMATION | SELF | SESSION
	|	SOURCEPROCEDURE | TARGETPROCEDURE | TEXTCURSOR | THISPROCEDURE | WEBCONTEXT
	;

widgettype
	:	BROWSE | BUFFER | BUTTON | COMBOBOX | CONTROLFRAME | DIALOGBOX
	|	EDITOR | FIELD | FILLIN | FRAME | IMAGE | MENU
	| 	MENUITEM | QUERY | RADIOSET | RECTANGLE | SELECTIONLIST 
	|	SLIDER | SOCKET | SUBMENU | TEMPTABLE | TEXT | TOGGLEBOX | WINDOW
	|	XDOCUMENT | XNODEREF
	;


//////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////
//                   begin PROGRESS syntax features, in alphabetical order
//////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////



// Because Antlr doesn't let us start names with underscore,
// we had to use AASERIAL instead of _SERIAL, etc.


aacbitfunc
	:	#(AACBIT funargs )
	;

aacontrolfunc
	:	AACONTROL
	;

aamsgfunc
	:	#(AAMSG funargs )
	;

aapcontrolfunc
	:	AAPCONTROL
	;

aaserialfunc
	:	AASERIAL
	;

aatracestatement
	:	#(	AATRACE						// statehead, Node attribute state2=...
			(	(stream_name)?
				(	(TO|FROM|THROUGH) io_phrase	//		""
				|	CLOSE				//		"CLOSE"
				)
			|	OFF					//		"OFF"
			|	#(ON (AALIST)? )			//		"ON"
			)
			state_end
		)
	;

absolutefunc
	:	#(ABSOLUTE funargs )
	;

accum_what
	:	AVERAGE|COUNT|MAXIMUM|MINIMUM|TOTAL|SUBAVERAGE|SUBCOUNT|SUBMAXIMUM|SUBMINIMUM|SUBTOTAL
	;

accumfunc
	:	#(ACCUMULATE accum_what ( #(BY expression (DESCENDING)? ) )? expression )
	;

accumulatestate
	:	#(ACCUMULATE (display_item)* state_end )
	;

aggregatephrase
	:	#(Aggregate_phrase LEFTPAREN (aggregate_opt)+ ( #(BY expression (DESCENDING)? ) )* RIGHTPAREN )
	;
aggregate_opt
	:	#(AVERAGE (label_constant)? )
	|	#(COUNT (label_constant)? )
	|	#(MAXIMUM (label_constant)? )
	|	#(MINIMUM (label_constant)? )
	|	#(TOTAL (label_constant)? )
	|	#(SUBAVERAGE (label_constant)? )
	|	#(SUBCOUNT (label_constant)? )
	|	#(SUBMAXIMUM (label_constant)? )
	|	#(SUBMINIMUM (label_constant)? )
	|	#(SUBTOTAL (label_constant)? )
	;

aliasfunc
	:	#(ALIAS funargs )
	;

ambiguousfunc
	:	#(AMBIGUOUS (RECORD_NAME | LEFTPAREN RECORD_NAME RIGHTPAREN) )
	;

analyzestate
	:	#(	ANALYZE filenameorvalue filenameorvalue
			( #(OUTPUT filenameorvalue ) )?
			(APPEND | ALL | NOERROR_KW)* state_end
		)
	;

applystate
	:	#(APPLY expression (#(TO gwidget ))? state_end )
	;

ascfunc
	:	#(ASC funargs )
	;

assign_opt
	:	#(ASSIGN ( #(EQUAL (ID|keyword) expression ) )+ )
	;

assignstate
	:	#(ASSIGN assignment_list (NOERROR_KW)? state_end )
	;
assignment_list
	:	RECORD_NAME (#(EXCEPT (field)+))?
	|	(	assign_equal (#(WHEN expression))?
		|	#(Assign_from_buffer field ) (#(WHEN expression))?
		)*
	;
assign_equal
	:	#(EQUAL (pseudfn|field) expression )
	;

atphrase
	:	#(	AT
			(	atphraseab atphraseab
			|	expression
			)
			(COLONALIGNED|LEFTALIGNED|RIGHTALIGNED)?
		)
	;
atphraseab
	:	#(COLUMN expression )
	|	#(COLUMNOF referencepoint )
	|	#(ROW expression )
	|	#(ROWOF referencepoint )
	|	#(X expression )
	|	#(XOF referencepoint )
	|	#(Y expression )
	|	#(YOF referencepoint )
	;
referencepoint
	:	field ((PLUS|MINUS) expression)?
	;

availablefunc
	:	#(AVAILABLE (RECORD_NAME | LEFTPAREN RECORD_NAME RIGHTPAREN) )
	;

bellstate
	:	#(BELL state_end )
	;

buffercomparestate
	:	#(	BUFFERCOMPARE
			RECORD_NAME
			(	#(EXCEPT (field)+)
			|	#(USING (field)+)
			)?
			TO RECORD_NAME
			(CASESENSITIVE|BINARY)?
			( #(SAVE ( #(RESULT IN_KW) )? field ) )?
			(EXPLICIT)?
			(	COMPARES
				(NOERROR_KW)?
				block_colon
				#(Code_block ( #(WHEN expression THEN blockorstate ) )* )
				#(END (COMPARES)? )
			|	NOERROR_KW
			)?
			state_end
		)
	;

buffercopystate
	:	#(	BUFFERCOPY RECORD_NAME
			(	#(EXCEPT (field)+)
			|	#(USING (field)+)
			)?
			TO RECORD_NAME
			( #(ASSIGN assignment_list ) )?
			(NOERROR_KW)?
			state_end 
		)
	;

callstate
	:	#(CALL anyorvalue (expressionorvalue)* state_end )
	;

candofunc
	:	#(CANDO funargs )
	;

canfindfunc
	:	#(CANFIND LEFTPAREN (findwhich)? recordphrase RIGHTPAREN )
	;
 
canqueryfunc
	:	#(CANQUERY funargs )
	;

cansetfunc
	:	#(CANSET funargs )
	;

capsfunc
	:	#(CAPS funargs )
	;

casesens_or_not
	:	#(Not_casesens NOT CASESENSITIVE )
	|	CASESENSITIVE
	;

casestate
	:	#(	CASE expression block_colon
			#(	Code_block
				(	#(WHEN case_expression THEN blockorstate )
				)*
			)
			( #(OTHERWISE blockorstate ) )?
			(EOF | #(END (CASE)? ) state_end)
		)
	;
case_expression
	:	(#(OR .))=> #(OR case_expression case_expression )
	|	#(WHEN expression)
	|	expression
	;

choosestate
	:	#(	CHOOSE (ROW|FIELD)
			( #(Form_item field (#(HELP constant))? ) )+
			(	AUTORETURN 
			|	#(COLOR anyorvalue) 
			|	goonphrase
			|	#(KEYS field )
			|	NOERROR_KW 
			|	#(PAUSE expression)
			)*
			(framephrase)?
			state_end
		)
	;

chrfunc
	:	#(CHR funargs )
	;

clearstate
	:	#(CLEAR (#(FRAME ID))? (ALL)? (NOPAUSE)? state_end )
	;

closequerystate
	:	#(CLOSE QUERY ID state_end )
	;

closestoredprocedurestate
	:	#(	CLOSE
			STOREDPROCEDURE ID
			( #(EQUAL field PROCSTATUS ) )?
			( #(WHERE PROCHANDLE EQ field ) )?
			state_end
		)
	;

codepageconvertfunc
	:	#(CODEPAGECONVERT funargs )
	;

collatefunc
	:	#(COLLATE funargs )
	;

color_expr
	:	#(BGCOLOR expression )
	|	#(DCOLOR expression )
	|	#(FGCOLOR expression )
	|	#(PFCOLOR expression )
	;

colorspecification
	:	(options{greedy=true;}:color_expr)+
	|	#(	COLOR (DISPLAY)? anyorvalue
			( #(PROMPT anyorvalue) )?
		)
	;

colorstate
	:	#(	COLOR
			(	( #(DISPLAY anyorvalue) | #(PROMPT anyorvalue) )
				( #(DISPLAY anyorvalue) | #(PROMPT anyorvalue) )?
			)?
			(#(Form_item field (formatphrase)? ))*
			(framephrase)? state_end
		)
	;

columnformat
	:	#(	Format_phrase
			(	#(FORMAT expression)
			|	label_constant
			|	NOLABELS
			|	#(COLUMNFONT expression )
			|	#(COLUMNDCOLOR expression )
			|	#(COLUMNBGCOLOR expression )
			|	#(COLUMNFGCOLOR expression )
			|	#(COLUMNPFCOLOR expression )
			|	#(LABELFONT expression )
			|	#(LABELDCOLOR expression )
			|	#(LABELBGCOLOR expression )
			|	#(LABELFGCOLOR expression )
			|	#(LEXAT field (columnformat)? )
			|	#(WIDTH NUMBER )
			|	#(WIDTHPIXELS NUMBER )
			|	#(WIDTHCHARS NUMBER )
			)+ 
		)
	;

comboboxphrase
	:	#(	COMBOBOX
			(	#(LISTITEMS constant (COMMA constant)* )
			|	#(LISTITEMPAIRS constant (COMMA constant)* )
			|	#(INNERLINES expression )
			|	SORT
			|	tooltip_expr
			|	SIMPLE
			|	DROPDOWN
			|	DROPDOWNLIST
			|	#(MAXCHARS NUMBER )
			|	#(AUTOCOMPLETION (UNIQUEMATCH)? )
			|	sizephrase
			)*
		)
	;

comparefunc
	:	#(COMPARE funargs )
	;

compilestate
	:	#(	COMPILE filenameorvalue
			(	#(ATTRSPACE (#(EQUAL expression))? )
			|	NOATTRSPACE
			|	#(SAVE (#(EQUAL expression))? ( #(INTO filenameorvalue ) )? )
			|	#(	LISTING filenameorvalue
					(	compile_append
					|	#(PAGESIZE_KW expression)
					|	#(PAGEWIDTH expression)
					)*
				)
			|	#(XCODE expression )
			|	#(XREF filenameorvalue (compile_append)? )
			|	#(STRINGXREF filenameorvalue (compile_append)? )
			|	#(STREAMIO (#(EQUAL expression))? )
			|	#(MINSIZE (#(EQUAL expression))? )
			|	#(LANGUAGES LEFTPAREN (compile_lang (COMMA compile_lang)*)? RIGHTPAREN )
			|	#(TEXTSEGGROW #(EQUAL expression) )
			|	#(DEBUGLIST filenameorvalue )
			|	#(DEFAULTNOXLATE (#(EQUAL expression))? )
			|	#(GENERATEMD5 (#(EQUAL expression))? )
			|	#(PREPROCESS filenameorvalue )
			|	#(USEREVVIDEO (#(EQUAL expression))? )
			|	#(USEUNDERLINE (#(EQUAL expression))? )
			|	#(V6FRAME (#(EQUAL expression))? )
			|	NOERROR_KW
			)*
			state_end
		)
	;
compile_lang
	:	valueexpression | TYPELESS_TOKEN (LEXCOLON TYPELESS_TOKEN)*
	;
compile_append
	:	#(APPEND (#(EQUAL expression))? )
	;

connectstate
	:	#(CONNECT (NOERROR_KW|DDE|filenameorvalue)* state_end )
	;

connectedfunc
	:	#(CONNECTED funargs )
	;

countoffunc
	:	#(COUNTOF funargs )
	;

createstate
	:	#(CREATE RECORD_NAME (#(USING (ROWID|RECID) expression))? (NOERROR_KW)? state_end )
	;

createaliasstate
	:	#(CREATE ALIAS anyorvalue FOR DATABASE anyorvalue (NOERROR_KW)? state_end )
	;

createautomationobjectstate
	:	#(CREATE QSTRING field (#(CONNECT (#(TO expression))?))? (NOERROR_KW)? state_end )
	;

createbrowsestate
	:	#(CREATE BROWSE field (#(IN_KW WIDGETPOOL expression))? (NOERROR_KW)? (assign_opt)? (triggerphrase)? state_end )
	;

createbufferstate
	:	#(	CREATE BUFFER field FOR TABLE expression
			( #(BUFFERNAME expression) )?
			(#(IN_KW WIDGETPOOL expression))?
			(NOERROR_KW)? state_end
		)
	;

createcallstate
	:	#(CREATE CALL field (#(IN_KW WIDGETPOOL expression))? (NOERROR_KW)? state_end )
	;

createdatabasestate
	:	#(CREATE DATABASE expression (#(FROM expression ))? (REPLACE)? (NOERROR_KW)? state_end )
	;

createquerystate
	:	#(CREATE QUERY field (#(IN_KW WIDGETPOOL expression))? (NOERROR_KW)? state_end )
	;

createsaxreaderstate
	:	#(CREATE SAXREADER field (#(IN_KW WIDGETPOOL expression))? (NOERROR_KW)? state_end )
	;

createserverstate
	:	#(CREATE SERVER field (assign_opt)? state_end )
	;

createserversocketstate
	:	#(CREATE SERVERSOCKET field (NOERROR_KW)? state_end )
	;

createsocketstate
	:	#(CREATE SOCKET field (NOERROR_KW)? state_end )
	;

createtemptablestate
	:	#(CREATE TEMPTABLE field (#(IN_KW WIDGETPOOL expression))? (NOERROR_KW)? state_end )
	;

createwidgetstate
	:	#(	CREATE
			(	valueexpression
			|	BUTTON | COMBOBOX | CONTROLFRAME | DIALOGBOX | EDITOR | FILLIN | FRAME | IMAGE
			|	MENU | MENUITEM | RADIOSET | RECTANGLE | SELECTIONLIST | SLIDER
			|	SUBMENU | TEXT | TOGGLEBOX | WINDOW
			)
			field
			(#(IN_KW WIDGETPOOL expression))? (NOERROR_KW)? (assign_opt)? (triggerphrase)? state_end
		)
	;

createwidgetpoolstate
	:	#(CREATE WIDGETPOOL (expression)? (PERSISTENT)? (NOERROR_KW)? state_end )
	;

createxdocumentstate
	:	#(CREATE XDOCUMENT field (#(IN_KW WIDGETPOOL expression))? (NOERROR_KW)? state_end )
	;

createxnoderefstate
	:	#(CREATE XNODEREF field (#(IN_KW WIDGETPOOL expression))? (NOERROR_KW)? state_end )
	;

currentchangedfunc
	:	#(CURRENTCHANGED (RECORD_NAME | LEFTPAREN RECORD_NAME RIGHTPAREN) )
	;

currentlanguagefunc
	:	CURRENTLANGUAGE
	;

currentresultrowfunc
	:	#(CURRENTRESULTROW funargs )
	;

currentvaluefunc
	:	#(CURRENTVALUE LEFTPAREN ID (COMMA ID)? RIGHTPAREN )
	;

cursorfunc
	:	CURSOR
	;

dataserversfunc
	:	DATASERVERS
	;

datefunc
	:	#(DATE funargs )
	;

dayfunc
	:	#(DAY funargs )
	;

dbcodepagefunc
	:	#(DBCODEPAGE funargs )
	;

dbcollationfunc
	:	#(DBCOLLATION funargs )
	;

dbnamefunc
	:	DBNAME
	;

dbparamfunc
	:	#(DBPARAM funargs )
	;

dbrestrictionsfunc
	:	#(DBRESTRICTIONS funargs )
	;

dbtaskidfunc
	:	#(DBTASKID funargs )
	;

dbtypefunc
	:	#(DBTYPE funargs )
	;

dbversionfunc
	:	#(DBVERSION funargs )
	;

ddeadvisestate
	:	#(DDE ADVISE expression (START|STOP) ITEM expression (#(TIME expression))? (NOERROR_KW)? state_end )
	;

ddeexecutestate
	:	#(DDE EXECUTE expression COMMAND expression (#(TIME expression))? (NOERROR_KW)? state_end )
	;

ddegetstate
	:	#(DDE GET expression TARGET field ITEM expression (#(TIME expression))? (NOERROR_KW)? state_end )
	;

ddeinitiatestate
	:	#(DDE INITIATE field FRAME expression APPLICATION expression TOPIC expression (NOERROR_KW)? state_end )
	;

dderequeststate
	:	#(DDE REQUEST expression TARGET field ITEM expression (#(TIME expression))? (NOERROR_KW)? state_end )
	;

ddesendstate
	:	#(DDE SEND expression SOURCE expression ITEM expression (#(TIME expression))? (NOERROR_KW)? state_end )
	;

ddeterminatestate
	:	#(DDE TERMINATE expression (NOERROR_KW)? state_end )
	;

decimalfunc
	:	#(DECIMAL funargs )
	;

definebrowsestate
	:	#(	DEFINE (#(NEW (GLOBAL)? SHARED ) | SHARED)? BROWSE ID
			(query_queryname)? (lockhow|NOWAIT)*
			(	#(	DISPLAY
					(	#(	Form_item
							(	(RECORD_NAME)=> RECORD_NAME
							|	expression (columnformat)?
							|	spacephrase
							)
						)
					)*
					(#(EXCEPT (field)+))?
				)
				(	#(	ENABLE
						(	#(ALL (#(EXCEPT (field)+))?)
						|	(	#(	Form_item field
									(	#(HELP constant)
									|	#(VALIDATE funargs)
									|	AUTORETURN
									|	DISABLEAUTOZAP
									)*
								)
							)*
						)
					)
				)?
			)?
			(display_with)*
			(tooltip_expr)?
			(#(CONTEXTHELPID expression))?
			state_end
		)
	;

definebufferstate
	:	#(	DEFINE (#(NEW (GLOBAL)? SHARED ) | SHARED)? BUFFER ID
			FOR RECORD_NAME (PRESELECT)? (label_constant)? (#(FIELDS (field)* ))? state_end
		)
	;

definebuttonstate
	:	#(	DEFINE (#(NEW (GLOBAL)? SHARED ) | SHARED)? BUTTON ID
			(	AUTOGO
			|	AUTOENDKEY
			|	DEFAULT
			|	color_expr
			|	#(CONTEXTHELPID expression)
			|	DROPTARGET
			|	#(FONT expression)
			|	#(IMAGEDOWN (imagephrase_opt)+ )
			|	#(IMAGE (imagephrase_opt)+ )
			|	#(IMAGEUP (imagephrase_opt)+ )
			|	#(IMAGEINSENSITIVE (imagephrase_opt)+ )
			|	#(MOUSEPOINTER expression )
			|	label_constant
			|	#(LIKE field (VALIDATE)?)
			|	FLATBUTTON
			|	#(NOFOCUS (FLATBUTTON)? )
			|	NOCONVERT3DCOLORS
			|	tooltip_expr
			|	sizephrase (MARGINEXTRA)?
			)*
			(triggerphrase)?
			state_end
		)
	;

defineframestate
	:	#(	DEFINE (#(NEW (GLOBAL)? SHARED ) | SHARED)? FRAME ID
			(form_item)*
			(	#(HEADER (display_item)+ )
			|	#(BACKGROUND (display_item)+ )
			)?
			(#(EXCEPT (field)+))?  (framephrase)?  state_end
		)
	;

defineimagestate
	:	#(	DEFINE (#(NEW (GLOBAL)? SHARED ) | SHARED)? IMAGE ID
			(	#(LIKE field (VALIDATE)?)
			|	imagephrase_opt 
			|	sizephrase
			|	color_expr
			|	CONVERT3DCOLORS
			|	tooltip_expr
			|	#(STRETCHTOFIT (RETAINSHAPE)? )
			|	TRANSPARENT
			)*
			(triggerphrase)?
			state_end
		)
	;

definemenustate
	:	#(	DEFINE (#(NEW (GLOBAL)? SHARED ) | SHARED)? MENU ID
			(menu_opt)* (menu_list_item)* state_end
		)
	;
menu_opt
	:	color_expr
	|	#(FONT expression)
	|	#(LIKE field (VALIDATE)?)
	|	#(TITLE expression)
	|	MENUBAR
	|	PINNABLE
	|	SUBMENUHELP
	;
menu_list_item
	:	(	#(	MENUITEM ID
				(	#(ACCELERATOR expression )
				|	color_expr
				|	DISABLED
				|	#(FONT expression)
				|	label_constant
				|	READONLY
				|	TOGGLEBOX
				)*
				(triggerphrase)? 
			)
		|	#(SUBMENU ID (DISABLED | label_constant | #(FONT expression) | color_expr)* )
		|	#(RULE (#(FONT expression) | color_expr)* )
		|	SKIP
		)
		// You can have PERIOD between menu items.
		((PERIOD (RULE|SKIP|SUBMENU|MENUITEM))=> PERIOD)?
	;

defineparameterstate
	:	#(	DEFINE (#(NEW (GLOBAL)? SHARED ) | SHARED)?
			(	PARAMETER BUFFER ID FOR RECORD_NAME (PRESELECT)? (label_constant)? (#(FIELDS (field)* ))?
			|	(INPUT|OUTPUT|INPUTOUTPUT|RETURN) PARAMETER
				(	TABLE FOR RECORD_NAME (APPEND)?
				|	TABLEHANDLE (FOR)? ID (APPEND)?
				|	ID defineparam_var (triggerphrase)?
				)
			)
			state_end
		)
	;
defineparam_var
	:	(	#(AS
				(	(#(HANDLE .))=> #(HANDLE ((TO)? (unreservedkeyword|ID|RECID) )? )
				|	(unreservedkeyword|ID|RECID)
				)
			)
		)?
		(	options{greedy=true;}
		:	casesens_or_not | #(FORMAT expression) | #(DECIMALS expression ) | #(LIKE field (VALIDATE)?)
		|	initial_constant | label_constant | NOUNDO
		)*
	;

definequerystate
	:	#(	DEFINE (#(NEW (GLOBAL)? SHARED ) | SHARED)? QUERY ID
			FOR RECORD_NAME (record_fields)?
			(COMMA RECORD_NAME (record_fields)?)*
			( #(CACHE expression) | SCROLLING | RCODEINFORMATION)*
			state_end
		)
	;

definerectanglestate
	:	#(	DEFINE (#(NEW (GLOBAL)? SHARED ) | SHARED)? RECTANGLE ID
			(	NOFILL
			|	#(EDGECHARS expression )
			|	#(EDGEPIXELS expression )
			|	color_expr
			|	GRAPHICEDGE
			|	#(LIKE field (VALIDATE)?)
			|	sizephrase
			|	tooltip_expr
			)*
			(triggerphrase)?
			state_end
		)
	;

definestreamstate
	:	#(	DEFINE (#(NEW (GLOBAL)? SHARED ) | SHARED)? STREAM ID state_end
		)
	;

definesubmenustate
	:	#(	DEFINE (#(NEW (GLOBAL)? SHARED ) | SHARED)? SUBMENU ID
			(menu_opt)* (menu_list_item)* state_end
		)
	;
   
definetemptablestate
	:	#(	DEFINE (#(NEW (GLOBAL)? SHARED ) | SHARED)? TEMPTABLE ID
			(UNDO|NOUNDO)?
			(def_table_like)?
			(label_constant)?
			(RCODEINFORMATION)?
			(def_table_field)*
			(	#(	INDEX ID ( (AS|IS)? (UNIQUE|PRIMARY|WORDINDEX) )*
					( ID (ASCENDING|DESCENDING|CASESENSITIVE)* )+
				)
			)*
			state_end
		)
	;
def_table_like
	:	#(	LIKE RECORD_NAME (VALIDATE)?
			( #(USEINDEX ID ((AS|IS) PRIMARY)? ) )*
		)
	;
def_table_field
	:	#(FIELD ID (fieldoption)* )
	;
   
defineworktablestate
	:	#(	DEFINE (#(NEW (GLOBAL)? SHARED ) | SHARED)? WORKTABLE ID
			(NOUNDO)? (def_table_like)? (label_constant)? (def_table_field)* state_end
		)
	;

definevariablestate
	:	#(	DEFINE (#(NEW (GLOBAL)? SHARED ) | SHARED)? VARIABLE ID
			(fieldoption)* (triggerphrase)? state_end
		)
	;

deletestate
	:	#(DELETE_KW RECORD_NAME (#(VALIDATE funargs))? (NOERROR_KW)? state_end )
	;

deletealiasstate
	:	#(DELETE_KW ALIAS (ID|QSTRING|valueexpression) state_end )
	;

deleteobjectstate
	:	#(DELETE_KW OBJECT expression (NOERROR_KW)? state_end )
	;

deleteprocedurestate
	:	#(DELETE_KW PROCEDURE expression (NOERROR_KW)? state_end )
	;

deletewidgetstate
	:	#(DELETE_KW WIDGET (gwidget)* state_end )
	;

deletewidgetpoolstate
	:	#(DELETE_KW WIDGETPOOL (expression)? (NOERROR_KW)? state_end )
	;

dictionarystate
	:	#(DICTIONARY state_end )
	;

disablestate
	:	#(DISABLE (UNLESSHIDDEN)? (#(ALL (#(EXCEPT (field)+))?) | (form_item)+)? (framephrase)? state_end )
	;

disabletriggersstate
	:	#(DISABLE TRIGGERS FOR (DUMP|LOAD) OF RECORD_NAME (ALLOWREPLICATION)? state_end )
	;

disconnectstate
	:	#(DISCONNECT filenameorvalue (NOERROR_KW)? state_end )
	;

displaystate
	:	#(	DISPLAY (stream_name)? (UNLESSHIDDEN)? (display_item)*
			(#(EXCEPT (field)+))? (#(IN_KW WINDOW expression))?
			(display_with)*
			(NOERROR_KW)?
			state_end
		)
	;
display_item
	:	#(	Form_item
			(	skipphrase
			|	spacephrase
			|	(expression|ID) (aggregatephrase|formatphrase)*
			)
		)
	;
display_with
	:	(#(WITH BROWSE ID))=> #(WITH BROWSE ID )
	|	framephrase
	;

dostate
	:	#(DO (block_for)? (block_preselect)? (block_opt)* block_colon code_block block_end )
	;

downstate
	:	#(DOWN ((stream_name (expression)?) | (expression (stream_name)?))? (framephrase)? state_end )
	;

// drop - see SQL grammar

dynamicfuncfunc
	:	#(DYNAMICFUNCTION LEFTPAREN expression (#(IN_KW expression))? (COMMA parameter)* RIGHTPAREN (NOERROR_KW)? )
	;

editorphrase
	:	#(	EDITOR
			(	#(INNERCHARS expression )
			|	#(INNERLINES expression )
			|	#(BUFFERCHARS expression )
			|	#(BUFFERLINES expression )
			|	LARGE
			|	#(MAXCHARS expression )
			|	NOBOX
			|	NOWORDWRAP
			|	SCROLLBARHORIZONTAL
			|	SCROLLBARVERTICAL
			|	tooltip_expr
			|	sizephrase
			)*
		)
	;

emptytemptablestate
	:	#(EMPTY TEMPTABLE RECORD_NAME (NOERROR_KW)? state_end )
	;

enablestate
	:	#(ENABLE (UNLESSHIDDEN)? (#(ALL (#(EXCEPT (field)+))?) | (form_item)+)? (#(IN_KW WINDOW expression))? (framephrase)? state_end )
	;

editingphrase
	:	#(Editing_phrase (ID LEXCOLON)? EDITING LEXCOLON (blockorstate)* END )
	;

encodefunc
	:	#(ENCODE funargs )
	;

entryfunc
	:	#(ENTRY funargs )
	;

etimefunc
	:	#(ETIME_KW (funargs)? )
	;

expfunc
	:	#(EXP funargs )
	;

exportstate
	:	#(EXPORT (stream_name)? (#(DELIMITER constant))? (display_item)* (#(EXCEPT (field)+))? state_end )
	;

extentfunc
	:	#(EXTENT LEFTPAREN field RIGHTPAREN )
	;

fieldoption
	:	#(AS (keyword|ID) )
	|	casesens_or_not
	|	color_expr
	|	#(CONTEXTHELPID expression)
	|	#(DECIMALS expression )
	|	DROPTARGET
	|	#(EXTENT expression )
	|	#(FONT expression)
	|	#(FORMAT expression)
	|	#(HELP constant)
	|	initial_constant
	|	label_constant
	|	#(LIKE field (VALIDATE)? )
	|	#(MOUSEPOINTER expression )
	|	NOUNDO
	|	viewasphrase
	;

fillinphrase
	:	#(FILLIN (NATIVE | sizephrase | tooltip_expr)* )
	;

fillfunc
	:	#(FILL funargs )
	;

findstate
	:	#(FIND (findwhich)? recordphrase (NOWAIT|NOPREFETCH|NOERROR_KW)* state_end )
	;

firstfunc
	:	#(FIRST funargs )
	;

firstoffunc
	:	#(FIRSTOF funargs )
	;

forstate
	:	#(FOR for_record_spec (block_opt)* block_colon code_block block_end )
	;
for_record_spec
	:	(findwhich)? recordphrase (COMMA (findwhich)? recordphrase)*
	;

form_item
	:	#(	Form_item
			(	RECORD_NAME
			|	#(TEXT LEFTPAREN (form_item)* RIGHTPAREN )
			|	constant (formatphrase)?
			|	spacephrase
			|	skipphrase
			|	CARET
			|	fieldorinline (formatphrase)?
			|	assign_equal
			)
		)
	;

formstate
	:	#(	FORMAT
			(form_item)*
			(	#(HEADER (display_item)+ )
			|	#(BACKGROUND (display_item)+ )
			)?
			( #(EXCEPT (field)+) )?
			(framephrase)?
			state_end
		)
	;

formatphrase
	:	#(	Format_phrase
			(	#(AS (keyword|ID) )
			|	atphrase
			|	ATTRSPACE
			|	NOATTRSPACE
			|	AUTORETURN
			|	color_expr
			|	#(CONTEXTHELPID expression)
			|	BLANK 
			|	#(COLON expression )
			|	#(TO expression)
			|	DEBLANK 
			|	DISABLEAUTOZAP 
			|	#(FONT expression ) 
			|	#(FORMAT expression)
			|	#(HELP constant)
			|	label_constant
			|	#(LEXAT fieldorinline (formatphrase)? )
			|	#(LIKE field )
			|	NOLABELS
			|	NOTABSTOP 
			|	#(VALIDATE funargs)
			|	#(WHEN expression)
			|	viewasphrase 
			)+
		)
	;

framephrase
	:	#(	WITH
			(	#(ACCUM (expression)? )
			|	ATTRSPACE | NOATTRSPACE
			|	#(CANCELBUTTON field )
			|	CENTERED 
			|	#(COLUMN expression )
			|	CONTEXTHELP | CONTEXTHELPFILE expression
			|	#(DEFAULTBUTTON field )
			|	EXPORT
			|	FITLASTCOLUMN
			|	#(FONT expression )
			|	FONTBASEDLAYOUT
			|	#(FRAME ID)
			|	#(LABELFONT expression )
			|	#(LABELDCOLOR expression )
			|	#(LABELFGCOLOR expression )
			|	#(LABELBGCOLOR expression )
			|	MULTIPLE | SINGLE | SEPARATORS | NOSEPARATORS | NOASSIGN| NOROWMARKERS
			|	NOSCROLLBARVERTICAL | SCROLLBARVERTICAL
			|	#(ROWHEIGHTCHARS expression )
			|	#(ROWHEIGHTPIXELS expression )
			|	EXPANDABLE | DROPTARGET | NOAUTOVALIDATE | NOCOLUMNSCROLLING
			|	KEEPTABORDER | NOBOX | NOEMPTYSPACE | NOHIDE | NOLABELS | USEDICTEXPS | NOVALIDATE 
			|	NOHELP | NOUNDERLINE | OVERLAY | PAGEBOTTOM | PAGETOP | NOTABSTOP
			|	#(RETAIN expression  )
			|	#(ROW expression )
			|	SCREENIO | STREAMIO
			|	#(SCROLL expression )
			|	SCROLLABLE | SIDELABELS 
			|	stream_name | THREED
			|	tooltip_expr
			|	TOPONLY | USETEXT
			|	V6FRAME | USEREVVIDEO | USEUNDERLINE
			|	#(	VIEWAS
					(	#(DIALOGBOX (DIALOGHELP (expression)?)? )
					|	MESSAGELINE
					|	STATUSBAR
					|	#(TOOLBAR (ATTACHMENT (TOP|BOTTOM|LEFT|RIGHT))? )
					)
				)
			|	#(WIDTH expression )
			|	#(IN_KW WINDOW expression)
			|	colorspecification | atphrase | sizephrase | titlephrase 
			|	#(With_columns expression COLUMNS )
			|	#(With_down expression DOWN )
			|	DOWN
			|	WITH
			)*
		)
	;

framecolfunc
	:	#(FRAMECOL (LEFTPAREN ID RIGHTPAREN)? )
	;

framedbfunc
	:	FRAMEDB
	;

framedownfunc
	:	#(FRAMEDOWN (LEFTPAREN ID RIGHTPAREN)? )
	;

framefieldfunc
	:	FRAMEFIELD
	;

framefilefunc
	:	FRAMEFILE
	;

frameindexfunc
	:	FRAMEINDEX
	;

framelinefunc
	:	#(FRAMELINE (LEFTPAREN ID RIGHTPAREN)? )
	;

framenamefunc
	:	FRAMENAME
	;

framerowfunc
	:	#(FRAMEROW (LEFTPAREN ID RIGHTPAREN)? )
	;

framevaluefunc
	:	FRAMEVALUE
	;

functionstate
	:	#(	FUNCTION ID
			(options{greedy=true;}:RETURNS|RETURN)? (keyword|ID) (PRIVATE)?
			( #(Parameter_list LEFTPAREN (function_param)? (COMMA function_param)* RIGHTPAREN ) )?
			(	FORWARDS (LEXCOLON|PERIOD|EOF)
			|	(IN_KW SUPER)=> IN_KW SUPER (LEXCOLON|PERIOD|EOF)
			|	(MAP (TO)? ID)? IN_KW expression (LEXCOLON|PERIOD|EOF)
			|	block_colon
				code_block
				(	EOF
				|	#(END (FUNCTION)? ) state_end
				)
			)
		)
	;
function_param
	:	#(BUFFER (ID)? FOR RECORD_NAME (PRESELECT)? )
	|	#(INPUT function_param_arg )
	|	#(OUTPUT function_param_arg )
	|	#(INPUTOUTPUT function_param_arg )
	;
function_param_arg
	:	(TABLE)=> TABLE (FOR)? RECORD_NAME (APPEND)?
	|	(TABLEHANDLE)=> TABLEHANDLE ID (APPEND)?
	|	( (ID AS)=> (ID AS) )? (keyword|ID)
	;

gatewaysfunc
	:	GATEWAYS
	;

getstate
	:	#(GET findwhich ID (lockhow|NOWAIT)* state_end )
	;

getbitsfunc
	:	#(GETBITS funargs )
	;

getbytefunc
	:	#(GETBYTE funargs )
	;

getbyteorderfunc
	:	#(GETBYTEORDER funargs )
	;

getbytesfunc
	:	#(GETBYTES funargs )
	;

getcodepagesfunc
	:	GETCODEPAGES
	;

getcollationsfunc
	:	#(GETCOLLATIONS funargs )
	;

getdoublefunc
	:	#(GETDOUBLE funargs )
	;

getfloatfunc
	:	#(GETFLOAT funargs )
	;

getkeyvaluestate
	:	#(GETKEYVALUE SECTION expression KEY (DEFAULT|expression) VALUE field state_end )
	;

getlicensefunc
	:	#(GETLICENSE funargs )
	;

getlongfunc
	:	#(GETLONG funargs )
	;

getpointervaluefunc
	:	#(GETPOINTERVALUE funargs )
	;

getshortfunc
	:	#(GETSHORT funargs )
	;

getsizefunc
	:	#(GETSIZE funargs )
	;

getstringfunc
	:	#(GETSTRING funargs )
	;

getunsignedshortfunc
	:	#(GETUNSIGNEDSHORT funargs )
	;

goonphrase
	:	#(GOON LEFTPAREN goon_elem ((options{greedy=true;}:COMMA)? goon_elem)* RIGHTPAREN )
	;
goon_elem
	:	~(RIGHTPAREN) ( (OF)=> OF gwidget)?
	;

gopendingfunc
	:	GOPENDING
	;

hidestate
	:	#(HIDE (stream_name)? (MESSAGE|ALL|(gwidget)*) (NOPAUSE)? (#(IN_KW WINDOW expression))? state_end )
	;

iffunc
	:	#(IF expression THEN expression ELSE expression )
	;

ifstate
	:	#(	IF expression THEN (blockorstate)?
			( #(ELSE (blockorstate)? ) )?
		)
	;

imagephrase_opt
	:	#(FILE expression )
	|	#(IMAGESIZE expression BY expression )
	|	#(IMAGESIZECHARS expression BY expression )
	|	#(IMAGESIZEPIXELS expression BY expression )
	|	#(	FROM
			( X expression | Y expression | ROW expression | COLUMN expression )
			( X expression | Y expression | ROW expression | COLUMN expression )
		)
	;

importstate
	:	#(	IMPORT (stream_name)?
			( #(DELIMITER constant) | UNFORMATTED )?
			(	RECORD_NAME (#(EXCEPT (field)+))?
			|	(field|CARET)+
			)
			(NOERROR_KW)? state_end
		)
	;

indexfunc
	:	#(INDEX funargs )
	;

initial_constant
	:	#(	INITIAL
			(	LEFTBRACE (TODAY|constant) (COMMA (TODAY|constant))* RIGHTBRACE
			|	(TODAY|constant)
			)
		)
	;

// INPUT function: see "field"

inputclearstate
	:	#(INPUT CLEAR state_end )
	;

inputclosestate
	:	#(INPUT (stream_name)? CLOSE state_end )
	;

inputfromstate
	:	#(INPUT (stream_name)? FROM io_phrase state_end )
	;
   
inputthroughstate
	:	#(INPUT (stream_name)? THROUGH io_phrase state_end )
	;

inputoutputclosestate
	:	#(INPUTOUTPUT (stream_name)? CLOSE state_end )
	;

inputoutputthroughstate
	:	#(INPUTOUTPUT (stream_name)? THROUGH io_phrase state_end )
	;

insertstate
	:	#(INSERT RECORD_NAME (#(EXCEPT (field)+))? (#(USING (ROWID|RECID) expression))? (framephrase)? (NOERROR_KW)? state_end )
	;

integerfunc
	:	#(INTEGER funargs )
	;

io_phrase
	:	(	#(OSDIR LEFTPAREN expression RIGHTPAREN (NOATTRLIST)? )
		|	#(PRINTER  (.)? )
		|	TERMINAL
		|	(valueexpression | FILENAME) *
		)
		(	APPEND
		|	BINARY
		|	COLLATE
		|	#(CONVERT ((SOURCE|TARGET) expression)* )
		|	NOCONVERT
		|	ECHO | NOECHO
		|	KEEPMESSAGES 
		|	LANDSCAPE
		|	#(MAP anyorvalue )
		|	NOMAP
		|	#(NUMCOPIES anyorvalue )
		|	PAGED
		|	#(PAGESIZE_KW anyorvalue )
		|	PORTRAIT
		|	UNBUFFERED 
		)*
	;

isattrspacefunc
	:	ISATTRSPACE
	;

isleadbytefunc
	:	#(ISLEADBYTE funargs )
	;

kblabelfunc
	:	#(KBLABEL funargs )
	;

keycodefunc
	:	#(KEYCODE funargs )
	;

keyfuncfunc
	:	#(KEYFUNCTION funargs )
	;

keylabelfunc
	:	#(KEYLABEL funargs )
	;

keywordfunc
	:	#(KEYWORD funargs )
	;

keywordallfunc
	:	#(KEYWORDALL funargs )
	;

label_constant
	:	#(COLUMNLABEL constant (COMMA constant)* )
	|	#(LABEL constant (COMMA constant)* )
	;

lastfunc
	:	#(LAST funargs )
	;

lastoffunc
	:	#(LASTOF funargs )
	;

lastkeyfunc
	:	LASTKEY
	;

lcfunc
	:	#(LC funargs )
	;

ldbnamefunc
	:	#(LDBNAME LEFTPAREN (#(BUFFER RECORD_NAME) | expression) RIGHTPAREN )
	;

leavestate
	:	#(LEAVE (BLOCK_LABEL)? state_end )
	;

lefttrimfunc
	:	#(LEFTTRIM funargs )
	;

lengthfunc
	:	#(LENGTH funargs )
	;

libraryfunc
	:	#(LIBRARY funargs )
	;

linecounterfunc
	:	#(LINECOUNTER (LEFTPAREN ID RIGHTPAREN)? )
	;

listeventsfunc
	:	#(LISTEVENTS funargs )
	;

listqueryattrsfunc
	:	#(LISTQUERYATTRS funargs )
	;

listsetattrsfunc
	:	#(LISTSETATTRS funargs )
	;

listwidgetsfunc
	:	#(LISTWIDGETS funargs )
	;

loadstate
	:	#(	LOAD expression
			(	#(DIR expression )
			|	APPLICATION
			|	DYNAMIC
			|	NEW
			|	#(BASEKEY expression )
			|	NOERROR_KW
			)*
			state_end
		)
	;

loadpicturefunc 
	:	#(LOADPICTURE (funargs)? )
	;

lockedfunc
	:	#(LOCKED (RECORD_NAME | LEFTPAREN RECORD_NAME RIGHTPAREN) )
	;

logfunc
	:	#(LOG funargs )
	;

logicalfunc
	:	#(LOGICAL funargs )
	;

lookupfunc
	:	#(LOOKUP funargs )
	;

machineclassfunc
	:	MACHINECLASS
	;

maximumfunc
	:	#(	MAXIMUM 
			(	(LEFTPAREN (DISTINCT|STAR|ALL))=> sqlaggregatefunc_arg
			|	funargs
			)
		)
	;

memberfunc
	:	#(MEMBER funargs )
	;

messagestate
	:	#(	MESSAGE
			( #(COLOR anyorvalue) )?
			( #(Form_item (skipphrase | expression) ) )*
			(	#(	VIEWAS ALERTBOX
					(MESSAGE|QUESTION|INFORMATION|ERROR|WARNING)?
					(BUTTONS (YESNO|YESNOCANCEL|OK|OKCANCEL|RETRYCANCEL) )?
					(#(TITLE expression))?
				)
			|	#(SET fieldorinline (formatphrase)? )
			|	#(UPDATE fieldorinline (formatphrase)? )
			)*
			( #(IN_KW WINDOW expression) )?
			state_end
		)
	;

messagelinesfunc
	:	MESSAGELINES
	;

minimumfunc
	:	#(	MINIMUM
			(	(LEFTPAREN (DISTINCT|STAR|ALL))=> sqlaggregatefunc_arg
			|	funargs
			)
		)
	;

monthfunc
	:	#(MONTH funargs )
	;

newfunc
	:	#(NEW (LEFTPAREN RECORD_NAME RIGHTPAREN | RECORD_NAME) )
	;

nextstate
	:	#(NEXT (BLOCK_LABEL)? state_end )
	;

nextpromptstate
	:	#(NEXTPROMPT field (framephrase)? state_end )
	;

nextvaluefunc
	:	#(NEXTVALUE LEFTPAREN ID (COMMA ID)* RIGHTPAREN )
	;

numaliasesfunc
	:	NUMALIASES
	;

numdbsfunc
	:	NUMDBS
	;

numentriesfunc
	:	#(NUMENTRIES funargs )
	;

numresultsfunc
	:	#(NUMRESULTS funargs )
	;

onstate
	:	#(	ON
			(	(ASSIGN|CREATE|DELETE_KW|FIND|WRITE)=>
				(	(CREATE|DELETE_KW|FIND) OF RECORD_NAME (label_constant)?
				|	WRITE OF RECORD_NAME (label_constant)?
					((NEW (BUFFER)? ID) (label_constant)?)?
					((OLD (BUFFER)? ID) (label_constant)?)? 
				|	ASSIGN OF field
					(#(TABLE LABEL constant))?
					(OLD (VALUE)? ID (options{greedy=true;}:defineparam_var)?)?
		 		)
				(OVERRIDE)?
				(	REVERT state_end
				|	PERSISTENT runstate
				|	blockorstate
				)
			|	QSTRING ANYWHERE blockorstate
			|	// ON keylabel keyfunction.
				( (ID|keyword) (ID|keyword) state_end )=> (ID|keyword) (ID|keyword) state_end
			|	eventlist
				(	ANYWHERE
				|	OF widgetlist
					(OR eventlist OF widgetlist)*
					(ANYWHERE)?
				)
				(	REVERT state_end
				|	PERSISTENT RUN filenameorvalue
					( #(IN_KW expression) )?
					(	#(	Parameter_list
							LEFTPAREN (INPUT)? expression
							(COMMA (INPUT)? expression)*
							RIGHTPAREN
						)
					)?
					state_end
				|	blockorstate
				)
			)
		)
	;

on___phrase
	:	#(	ON (ENDKEY|ERROR|STOP|QUIT)
			( #(UNDO (BLOCK_LABEL)? ) )?
			(	COMMA
				(	#(LEAVE (BLOCK_LABEL)? )
				|	#(NEXT (BLOCK_LABEL)? )
				|	#(RETRY (BLOCK_LABEL)? )
				|	#(RETURN (ERROR|NOAPPLY)? (expression)? )
				)
			)?
		)
	;

openquerystate
	:	#(	OPEN QUERY ID (FOR|PRESELECT) for_record_spec
			(	querytuningphrase
			|	#(BY expression (DESCENDING)? )
			|	INDEXEDREPOSITION
			|	#(MAXROWS expression )
			)*
			state_end
		)
	;

opsysfunc
	:	OPSYS
	;

osappendstate
	:	#(OSAPPEND anyorvalue anyorvalue state_end )
	;

oscommandstate
	:	#(OS400		(SILENT|NOWAIT|NOCONSOLE)* (anyorvalue)* state_end )
	|	#(BTOS		(SILENT|NOWAIT|NOCONSOLE)* (anyorvalue)* state_end )
	|	#(DOS		(SILENT|NOWAIT|NOCONSOLE)* (anyorvalue)* state_end )
	|	#(MPE		(SILENT|NOWAIT|NOCONSOLE)* (anyorvalue)* state_end )
	|	#(OS2		(SILENT|NOWAIT|NOCONSOLE)* (anyorvalue)* state_end )
	|	#(OSCOMMAND	(SILENT|NOWAIT|NOCONSOLE)* (anyorvalue)* state_end )
	|	#(UNIX		(SILENT|NOWAIT|NOCONSOLE)* (anyorvalue)* state_end )
	|	#(VMS		(SILENT|NOWAIT|NOCONSOLE)* (anyorvalue)* state_end )
	;

oscopystate
	:	#(OSCOPY anyorvalue anyorvalue state_end )
	;

oscreatedirstate
	:	#(OSCREATEDIR (anyorvalue)+ state_end )
	;

osdeletestate
	:	#(OSDELETE (valueexpression | ~(VALUE|RECURSIVE|PERIOD) )+ (RECURSIVE)? state_end )
	;

osdrivesfunc
	:	OSDRIVES
	;

oserrorfunc
	:	OSERROR
	;

osgetenvfunc
	:	#(OSGETENV funargs )
	;

osrenamestate
	:	#(OSRENAME anyorvalue anyorvalue state_end )
	;

outputclosestate
	:	#(OUTPUT (stream_name)? CLOSE state_end )
	;

outputthroughstate
	:	#(OUTPUT (stream_name)? THROUGH io_phrase state_end )
	;

outputtostate
	:	#(OUTPUT (stream_name)? TO io_phrase state_end )
	;

overlay_pseudfn
	:	#(OVERLAY funargs )
	;

pagestate
	:	#(PAGE (stream_name)? state_end )
	;

pagenumberfunc
	:	#(PAGENUMBER (LEFTPAREN ID RIGHTPAREN)? )
	;

pagesizefunc
	:	#(PAGESIZE_KW (LEFTPAREN ID RIGHTPAREN)? )
	;

pausestate
	:	#(	PAUSE (expression)?
			(	BEFOREHIDE
			|	#(MESSAGE constant )
			|	NOMESSAGE
			|	#(IN_KW WINDOW expression)
			)*
			state_end
		)
	;

pdbnamefunc
	:	#(PDBNAME funargs )
	;

procedurestate
	:	#(	PROCEDURE ID
			(	#(	EXTERNAL constant
					(	CDECL_KW
					|	PASCAL_KW
					|	STDCALL_KW
					|	#(ORDINAL expression )
					|	PERSISTENT
					)*
				)
			|	PRIVATE
			|	IN_KW SUPER
			)?
			block_colon code_block (EOF | #(END (PROCEDURE)?) state_end)
		)
	;

prochandlefunc
	:	PROCHANDLE
	;

procstatusfunc
	:	PROCSTATUS
	;

processeventsstate
	:	#(PROCESS EVENTS state_end )
	;

programnamefunc
	:	#(PROGRAMNAME funargs )
	;

progressfunc
	:	PROGRESS
	;

promptforstate
	:	#(	PROMPTFOR (stream_name)? (UNLESSHIDDEN)? (form_item)*
			(goonphrase)?  (#(EXCEPT (field)+))?  (#(IN_KW WINDOW expression))?  (framephrase)?  (editingphrase)?
			state_end
		)
	;

promsgsfunc
	:	PROMSGS
	;

propathfunc
	:	PROPATH
	;

proversionfunc
	:	PROVERSION
	;

publishstate
	:	#(PUBLISH expression (#(FROM expression) )? (parameterlist)? state_end )
	;

putstate
	:	#(	PUT	
			(stream_name)? (CONTROL|UNFORMATTED)?
			(	( #(NULL_KW (LEFTPAREN)? ) )=> #(NULL_KW (funargs)? )
			|	skipphrase
			|	spacephrase
			|	expression (#(FORMAT expression)|#(AT expression )|#(TO expression))*
			)*
			state_end
		)
	;

putcursorstate
	:	#(PUT CURSOR (OFF | (#(ROW expression)|#(COLUMN expression))* ) state_end )
	;

putscreenstate
	:	#(	PUT SCREEN
			( ATTRSPACE | NOATTRSPACE | #(COLOR anyorvalue) | #(COLUMN expression) | #(ROW expression) | expression )*
			state_end
		)
	;

putbits_pseudfn
	:	#(PUTBITS funargs )
	;

putbyte_pseudfn
	:	#(PUTBYTE funargs )
	;

putbytes_pseudfn
	:	#(PUTBYTES funargs )
	;

putdouble_pseudfn
	:	#(PUTDOUBLE funargs )
	;

putfloat_pseudfn
	:	#(PUTFLOAT funargs )
	;

putkeyvaluestate
	:	#(	PUTKEYVALUE
			(	SECTION expression KEY (DEFAULT|expression) VALUE expression
			|	(COLOR|FONT) (expression|ALL)
			)
			(NOERROR_KW)? state_end
		)
	;

putlong_pseudfn
	:	#(PUTLONG funargs )
	;

putshort_pseudfn
	:	#(PUTSHORT funargs )
	;

putstring_pseudfn
	:	#(PUTSTRING funargs )
	;

putunsignedshort_pseudfn
	:	#(PUTUNSIGNEDSHORT funargs )
	;

query_queryname
	:	#(QUERY ID )
	;

querytuningphrase
	:	#(	QUERYTUNING LEFTPAREN
			(	ARRAYMESSAGE | NOARRAYMESSAGE
			|	BINDWHERE | NOBINDWHERE
			|	#(CACHESIZE NUMBER (ROW|BYTE)? )
			|	#(DEBUG (SQL|EXTENDED|CURSOR|DATABIND|PERFORMANCE|VERBOSE|SUMMARY|NUMBER)? )
			|	NODEBUG
			|	DEFERLOBFETCH
			|	#(HINT expression )
			|	INDEXHINT | NOINDEXHINT
			|	JOINBYSQLDB | NOJOINBYSQLDB
			|	LOOKAHEAD | NOLOOKAHEAD
			|	ORDEREDJOIN
			|	REVERSEFROM
			|	SEPARATECONNECTION | NOSEPARATECONNECTION
			)*
			RIGHTPAREN
		)
	;

queryoffendfunc
	:	#(QUERYOFFEND funargs )
	;

quitstate
	:	#(QUIT state_end )
	;

quoterfunc
	:	#(QUOTER funargs )
	;

rindexfunc
	:	#(RINDEX funargs )
	;

radiosetphrase
	:	#(	RADIOSET
			(	#(HORIZONTAL (EXPAND)? )
			|	VERTICAL
			|	(sizephrase)
			|	#(RADIOBUTTONS (constant|ID) COMMA (constant|TODAY) (COMMA (constant|ID) COMMA (constant|TODAY))* )
			|	tooltip_expr
			)*
		)
	;

randomfunc
	:	#(RANDOM funargs )
	;

rawfunc
	:	#(RAW funargs )
	;

rawtransferstate
	:	#(RAWTRANSFER (BUFFER|FIELD)? (RECORD_NAME|field) TO (BUFFER|FIELD)? (RECORD_NAME|field) (NOERROR_KW)? state_end )
	;

readkeystate
	:	#(READKEY (stream_name)? (#(PAUSE expression))? state_end )
	;

repeatstate
	:	#(REPEAT (block_for)? (block_preselect)? (block_opt)* block_colon code_block block_end )
	;

recidfunc
	:	#(RECID LEFTPAREN RECORD_NAME RIGHTPAREN )
	;

record_fields
	:	#(FIELDS (LEFTPAREN (field (#(WHEN expression))?)* RIGHTPAREN)? )
	|	#(EXCEPT (LEFTPAREN (field (#(WHEN expression))?)* RIGHTPAREN)? )
	;

recordphrase
	:	#(	RECORD_NAME (record_fields)? (options{greedy=true;}:TODAY|constant)?
			(	#(LEFT OUTERJOIN )
			|	OUTERJOIN
			|	#(OF RECORD_NAME )
			|	#(WHERE (expression)? )
			|	#(USEINDEX ID )
			|	#(USING field (AND field)* )
			|	lockhow
			|	NOWAIT
			|	NOPREFETCH
			|	NOERROR_KW
			)*
		)
	;

recordlengthfunc
	:	#(RECORDLENGTH LEFTPAREN RECORD_NAME RIGHTPAREN )
	;

releasestate
	:	#(RELEASE RECORD_NAME (NOERROR_KW)? state_end )
	;

releaseexternalstate
	:	#(RELEASE EXTERNAL (PROCEDURE)? expression (NOERROR_KW)? state_end )
	;

releaseobjectstate
	:	#(RELEASE OBJECT expression (NOERROR_KW)? state_end )
	;

replacefunc
	:	#(REPLACE funargs )
	;

repositionstate
	:	#(	REPOSITION ID
			(	#(	TO
					(	ROWID expression (COMMA expression)* 
					|	RECID expression
					|	ROW expression
					)
				)
			|	#(ROW expression )
			|	#(FORWARDS expression )
			|	#(BACKWARDS expression )
			)
			(NOERROR_KW)? state_end
		)
	;

retryfunc
	:	RETRY
	;

returnstate
	:	#(RETURN (ERROR|NOAPPLY)? (expression)? state_end )
	;

returnvaluefunc
	:	RETURNVALUE
	;

rgbvaluefunc
	:	#(RGBVALUE funargs )
	;

righttrimfunc
	:	#(RIGHTTRIM funargs )
	;

roundfunc
	:	#(ROUND funargs )
	;

rowidfunc
	:	#(ROWID LEFTPAREN RECORD_NAME RIGHTPAREN )
	;

runstate
	:	#(	RUN filenameorvalue
			(LEFTANGLE LEFTANGLE filenameorvalue RIGHTANGLE RIGHTANGLE)?
			(	#(PERSISTENT ( #(SET (field)? ) )? )
			|	#(ON (SERVER)? expression (TRANSACTION (DISTINCT)?)? )
			|	#(IN_KW expression)
			|	#(	ASYNCHRONOUS ( #(SET (field)? ) )?
					( #(EVENTPROCEDURE expression ) )?
					(#(IN_KW expression))?
				)
			)*
			(parameterlist)?
			(NOERROR_KW|anyorvalue)*
			state_end
		)
	;

runstoredprocedurestate
	:	#(RUN STOREDPROCEDURE ID (assign_equal)? (NOERROR_KW)? (parameterlist)? state_end )
	;

runsuperstate
	:	#(RUN SUPER (parameterlist)? (NOERROR_KW)? state_end )
	;

savecachestate
	:	#(SAVE CACHE (CURRENT|COMPLETE) anyorvalue TO filenameorvalue (NOERROR_KW)? state_end )
	;

screenlinesfunc
	:	SCREENLINES
	;

scrollstate
	:	#(SCROLL (FROMCURRENT)? (UP)? (DOWN)? (framephrase)? state_end )
	;

sdbnamefunc
	:	#(SDBNAME funargs )
	;

searchfunc
	:	#(SEARCH funargs )
	;

seekfunc
	:	#(SEEK LEFTPAREN (INPUT|OUTPUT|ID) RIGHTPAREN )
	;

seekstate
	:	#(SEEK (INPUT|OUTPUT|stream_name) TO (expression|END) state_end )
	;

selectionlistphrase
	:	#(	SELECTIONLIST
			(	SINGLE
			|	MULTIPLE
			|	NODRAG
			|	#(LISTITEMS constant (COMMA constant)* )
			|	#(LISTITEMPAIRS constant (COMMA constant)* )
			|	SCROLLBARHORIZONTAL
			|	SCROLLBARVERTICAL
			|	#(INNERCHARS expression )
			|	#(INNERLINES expression )
			|	SORT
			|	tooltip_expr
			|	sizephrase
			)*
		)
	;

setbyteorder_pseudfn
	:	#(SETBYTEORDER funargs )
	;

setstate
	:	#(	SET
			(stream_name)? (UNLESSHIDDEN)? (form_item)*
			(goonphrase)?  (#(EXCEPT (field)+))?  (#(IN_KW WINDOW expression))?  (framephrase)?  (editingphrase)?  (NOERROR_KW)?
			state_end
		)
	;

setpointervalue_pseudfn
	:	#(SETPOINTERVALUE funargs )
	;

setsize_pseudfn
	:	#(SETSIZE funargs )
	;

setuseridfunc
	:	#(SETUSERID funargs )
	;

showstatsstate
	:	#(SHOWSTATS (CLEAR)? state_end )
	;

sizephrase
	:	#(SIZE expression BY expression )
	|	#(SIZECHARS expression BY expression )
	|	#(SIZEPIXELS expression BY expression )
	;

skipphrase
	:	#(SKIP (funargs)? )
	;

sliderphrase
	:	#(	SLIDER
			(	HORIZONTAL
			|	#(MAXVALUE expression )
			|	#(MINVALUE expression )
			|	VERTICAL
			|	NOCURRENTVALUE
			|	LARGETOSMALL
			|	#(TICMARKS (NONE|TOP|BOTTOM|LEFT|RIGHT|BOTH) (#(FREQUENCY expression))? )
			|	tooltip_expr
			|	sizephrase
			)*
		)
	;

spacephrase
	:	#(SPACE (funargs)? )
	;

sqrtfunc
	:	#(SQRT funargs )
	;

state_end
	:	PERIOD | EOF
	;

statusstate
	:	#(	STATUS
			(	#(DEFAULT (expression)? )
			|	#(INPUT (OFF|expression)? )
			)
			(#(IN_KW WINDOW expression))?
		state_end
		)
	;

stopstate
	:	#(STOP state_end )
	;

stream_name
	:	#(STREAM ID )
	;

stringfunc
	:	#(STRING funargs )
	;

subscribestate
	:	#(	SUBSCRIBE ( #(PROCEDURE expression) )? (TO)? expression
			(ANYWHERE | #(IN_KW expression) )
			( #(RUNPROCEDURE expression) )?
			(NOERROR_KW)? state_end
		)
	;
   
substitutefunc
	:	#(SUBSTITUTE funargs )
	;

substringfunc
	:	#(SUBSTRING funargs )
	;

superfunc
	:	#(SUPER (parameterlist)? )
	;

systemdialogcolorstate
	:	#(SYSTEMDIALOG COLOR expression ( #(UPDATE field) )? (#(IN_KW WINDOW expression))? state_end )
	;

systemdialogfontstate
	:	#(	SYSTEMDIALOG FONT expression
			(	ANSIONLY
			|	FIXEDONLY
			|	#(MAXSIZE expression )
			|	#(MINSIZE expression )
			|	#(UPDATE field )
			|	#(IN_KW WINDOW expression)
			)*
			state_end
		)
	;

systemdialoggetfilestate
	:	#(	SYSTEMDIALOG GETFILE field
			(	#(	FILTERS expression expression (COMMA expression expression)*
					( #(INITIALFILTER expression ) )?
				)
			|	ASKOVERWRITE
			|	CREATETESTFILE
			|	#(DEFAULTEXTENSION expression )
			|	#(INITIALDIR expression )
			|	MUSTEXIST
			|	RETURNTOSTARTDIR
			|	SAVEAS
			|	#(TITLE expression)
			|	USEFILENAME
			|	#(UPDATE field )
			|	#(IN_KW WINDOW expression)
			)*
			state_end
		)
	;

systemdialogprintersetupstate
	:	#(	SYSTEMDIALOG PRINTERSETUP
			( #(NUMCOPIES expression) | #(UPDATE field) | LANDSCAPE | PORTRAIT | #(IN_KW WINDOW expression) )*
			state_end
		)
	;

systemhelpstate
	:	#(	SYSTEMHELP expression
			( #(WINDOWNAME expression) )?
			(	#(ALTERNATEKEY expression )
			|	#(CONTEXT expression )
			|	CONTENTS 
			|	#(SETCONTENTS expression )
			|	FINDER
			|	#(CONTEXTPOPUP expression )
			|	#(HELPTOPIC expression )
			|	#(KEY expression )
			|	#(PARTIALKEY (expression)? )
			|	#(MULTIPLEKEY expression TEXT expression )
			|	#(COMMAND expression )
			|	#(POSITION (MAXIMIZE | X expression Y expression WIDTH expression HEIGHT expression) )
			|	FORCEFILE
			|	HELP
			|	QUIT
			)
			state_end
		)
	;

terminalfunc
	:	TERMINAL
	;

textphrase
	:	#(TEXT (sizephrase | tooltip_expr)* )
	;

timefunc
	:	TIME
	;

titlephrase
	:	#(TITLE (color_expr | #(COLOR anyorvalue) | #(FONT expression) )* expression )
	;

todayfunc
	:	TODAY
	;

toggleboxphrase
	:	#(TOGGLEBOX (sizephrase | tooltip_expr)* )
	;

tooltip_expr
	:	#(TOOLTIP (valueexpression | constant) )
	;

torowidfunc
	:	#(TOROWID funargs )
	;

transactionfunc
	:	TRANSACTION
	;

transactionmodeautomaticstate
	:	#(TRANSACTIONMODE AUTOMATIC (CHAINED)? state_end )
	;

triggerphrase
	:	#(	TRIGGERS block_colon
			#(	Code_block
				( #(ON eventlist (ANYWHERE)? (PERSISTENT runstate | blockorstate) ) )*
			)
			#(END (TRIGGERS)? )
		)
	;

triggerprocedurestate
	:	#(	TRIGGER PROCEDURE FOR
			(	(CREATE|DELETE_KW|FIND|REPLICATIONCREATE|REPLICATIONDELETE)
				OF RECORD_NAME (label_constant)?
			|	(WRITE|REPLICATIONWRITE) OF RECORD_NAME (label_constant)?
				(NEW (BUFFER)? ID (label_constant)?)?
				(OLD (BUFFER)? ID (label_constant)?)? 
			|	ASSIGN
				(	#(OF field (#(TABLE LABEL constant))? )
				|	#(NEW (VALUE)? id:ID defineparam_var )
					{	FieldSymbol symbol = new FieldSymbol(#id.getText(), currentScope);
						symbol.symbolId = currentScope.add(symbol);
						symbol.storeType = IConstants.ST_VAR;
						parser.attrSet( h(#id), IConstants.SCOPE_ID, currentScope.scopeId);
						parser.attrSet( h(#id), IConstants.SYMBOL_ID, symbol.symbolId);
					}
				)? 
				(	#(OLD (VALUE)? id2:ID defineparam_var )
					{	FieldSymbol symbol = new FieldSymbol(#id2.getText(), currentScope);
						symbol.symbolId = currentScope.add(symbol);
						symbol.storeType = IConstants.ST_VAR;
						parser.attrSet( h(#id2), IConstants.SCOPE_ID, currentScope.scopeId);
						parser.attrSet( h(#id2), IConstants.SYMBOL_ID, symbol.symbolId);
					}

				)?
			)
			state_end
		)
	;

trimfunc
	:	#(TRIM funargs )
	;

truncatefunc
	:	#(TRUNCATE funargs )
	;

underlinestate
	:	#(UNDERLINE (stream_name)? (#(Form_item field (formatphrase)? ))* (framephrase)? state_end )
	;

undostate
	:	#(	UNDO (BLOCK_LABEL)?
			(	COMMA
				(	#(LEAVE (BLOCK_LABEL)? )
				|	#(NEXT (BLOCK_LABEL)? )
				|	#(RETRY (BLOCK_LABEL)? )
				|	#(RETURN (ERROR|NOAPPLY)? (expression)? )
				)
			)?
			state_end
		)
	;

unloadstate
	:	#(UNLOAD expression (NOERROR_KW)? state_end )
	;

unsubscribestate
	:	#(UNSUBSCRIBE (#(PROCEDURE expression))? (TO)? (expression|ALL) (#(IN_KW expression))? state_end )
	;

upstate
	:	#(UP (options{greedy=true;}:stream_name)? (expression)? (stream_name)? (framephrase)? state_end )
	;

updatestatement
	:	(#(UPDATE RECORD_NAME SET))=> sqlupdatestate
	|	updatestate
	;

updatestate
	:	#(	UPDATE
			(UNLESSHIDDEN)?	
			(form_item)*
			(goonphrase)?
			(#(EXCEPT (field)+))?
			(#(IN_KW WINDOW expression))?
			(framephrase)?
			(editingphrase)?
			(NOERROR_KW)?
			state_end
		)
	;

usestate
	:	#(USE expression (NOERROR_KW)? state_end )
	;

useridfunc
	:	#(USERID (funargs)? )
	|	#(USER (funargs)? )
	;

valideventfunc
	:	#(VALIDEVENT funargs )
	;

validhandlefunc
	:	#(VALIDHANDLE funargs )
	;

validatestate
	:	#(VALIDATE RECORD_NAME (NOERROR_KW)? state_end )
	;

viewstate
	:	#(VIEW (stream_name)? (gwidget)* (#(IN_KW WINDOW expression))? state_end )
	;

viewasphrase
	:	#(	VIEWAS
			(	comboboxphrase
			|	editorphrase
			|	fillinphrase
			|	radiosetphrase
			|	selectionlistphrase
			|	sliderphrase
			|	textphrase
			|	toggleboxphrase
			)
		)
	;

waitforstate
	:	#(	WAITFOR
			eventlist OF widgetlist
			(#(OR eventlist OF widgetlist))*
			(#(FOCUS gwidget))?
			(#(PAUSE expression))?
			(EXCLUSIVEWEBUSER (expression)?)?
			state_end
		)
	;

weekdayfunc
	:	#(WEEKDAY funargs )
	;

widgethandlefunc
	:	#(WIDGETHANDLE funargs )
	;

yearfunc
	:	#(YEAR funargs )
	;



// Due to name collisions, we use NULL_KW instead of NULL, and ETIME_KW instead of ETIME.
keyword
	:
AACBIT| AACONTROL| AALIST| AAMEMORY| AAMSG| AAPCONTROL| AASERIAL| AATRACE|
ABSOLUTE| ACCELERATOR| ACCUMULATE| ACTIVEWINDOW| ADD| ADVISE| ALERTBOX| ALIAS| ALL|
ALLOWREPLICATION| ALTER| ALTERNATEKEY|
AMBIGUOUS| ANALYZE| AND| ANSIONLY| ANY| ANYWHERE| APPEND| APPLICATION| APPLY|
ARRAYMESSAGE| AS| ASC| ASCENDING| ASKOVERWRITE| ASSIGN| ASYNCHRONOUS | AT| ATTACHMENT|
ATTRSPACE| AUTHORIZATION| 
AUTOCOMPLETION| AUTOENDKEY| AUTOGO| AUTOMATIC|
AUTORETURN| AVAILABLE| AVERAGE| AVG| BACKGROUND| BACKWARDS| BASEKEY| BEFOREHIDE| 
BEGINS| BELL| BETWEEN| BGCOLOR| BIGENDIAN| BINARY| BINDWHERE| BLANK| BOTH| BOTTOM| BREAK| BROWSE| 
BTOS| BUFFER| BUFFERCHARS| BUFFERCOMPARE| BUFFERCOPY| BUFFERLINES| BUFFERNAME| BUTTON| BUTTONS| 
BY| BYPOINTER| BYTE| BYVARIANTPOINTER| CACHE| CACHESIZE| CALL| CANDO| CANFIND| CANQUERY|
CANSET| CANCELBUTTON| CAPS| CASE| CASESENSITIVE| CDECL_KW| CENTERED| CHAINED| CHARACTER| CHARACTERLENGTH| CHECK|
CHOOSE| CHR| CLEAR| CLIPBOARD| CLOSE| CODEBASELOCATOR|
CODEPAGECONVERT| COLLATE| COLOF| COLON| COLONALIGNED| COLOR| COLORTABLE|
COLUMN| COLUMNBGCOLOR| COLUMNDCOLOR| COLUMNFGCOLOR| COLUMNFONT| COLUMNLABEL| COLUMNOF| COLUMNPFCOLOR| COLUMNS|
COMHANDLE| COMBOBOX| COMMAND| COMPARES| COMPLETE| COMPILE| COMPILER| COMSELF| CONFIGNAME| CONNECT| CONNECTED| CONTAINS|
CONTENTS| CONTEXT| CONTEXTHELP| CONTEXTHELPFILE| CONTEXTHELPID| CONTEXTPOPUP| 
CONTROL| CONTROLFRAME| CONVERT| CONVERT3DCOLORS| COUNT| COUNTOF| CREATE|
CREATETESTFILE| CURRENT| CURRENTCHANGED| CURRENTENVIRONMENT| CURRENTLANGUAGE| CURRENTRESULTROW| CURRENTVALUE|
CURRENTWINDOW| CURSOR| DATABASE| DATABIND| DATASERVERS| DATE| DAY| DBCODEPAGE| DBCOLLATION| DBIMS| DBNAME|
DBPARAM| DBRESTRICTIONS| DBTASKID| DBTYPE| DBVERSION| DCOLOR| DDE| DEBLANK| DEBUG| DEBUGLIST| DEBUGGER|
DECIMAL| DECIMALS| DECLARE| DEFAULT| DEFAULTBUTTON| DEFAULTEXTENSION| 
DEFAULTNOXLATE| DEFAULTWINDOW| DEFERLOBFETCH| DEFINE| DEFINED|
DELETE_KW| DELETEPROCEDURE| DELETERESULTLISTENTRY| DELIMITER| DESC| DESCENDING| DESELECTION| DIALOGBOX| DIALOGHELP|
DICTIONARY| DIR| DISABLE| DISABLEAUTOZAP| DISABLED| DISCONNECT| DISPLAY| DISTINCT| DO| DOS| DOUBLE| DOWN| DROP| 
DROPDOWN| DROPDOWNLIST| DROPFILENOTIFY| DROPTARGET| DUMP| DYNAMIC| DYNAMICFUNCTION| EACH| ECHO| EDGECHARS| EDGEPIXELS| 
EDITUNDO| EDITING| EDITOR| ELSE| EMPTY| ENABLE| ENCODE| END| ENDMOVE| ENDRESIZE| ENDROWRESIZE| ENDKEY| ENTERED|
ENTRY| EQ| ERROR| ERRORSTATUS| ESCAPE| ETIME_KW| EVENTPROCEDURE |EVENTS| EXCEPT| EXCLUSIVEID| EXCLUSIVELOCK| 
EXCLUSIVEWEBUSER| EXECUTE|
EXISTS| EXP| EXPAND| EXPANDABLE| EXPLICIT| EXPORT| EXTENDED| EXTENT| EXTERNAL| FALSE_KW| FETCH| FGCOLOR| FIELD|
FIELDS| FILE| FILEINFORMATION| FILL| FILLIN| FILTERS| FIND| FINDCASESENSITIVE| FINDER| FINDGLOBAL|
FINDNEXTOCCURRENCE| FINDPREVOCCURRENCE| FINDSELECT| FINDWRAPAROUND| FIRST| FIRSTOF| 
FITLASTCOLUMN| FIXEDONLY| FLATBUTTON|
FLOAT| FOCUS| FONT| FONTTABLE| FOR| FORCEFILE| FORMINPUT| FORMAT| FORWARDS| FRAME|
FRAMECOL| FRAMEDB| FRAMEDOWN| FRAMEFIELD| FRAMEFILE| FRAMEINDEX| FRAMELINE| FRAMENAME| FRAMEROW| FRAMEVALUE| 
FREQUENCY| FROM| FROMCURRENT| FUNCTION| GE| GENERATEMD5|
GET| GETBITS| GETBUFFERHANDLE| GETBYTE| GETBYTES| GETBYTEORDER| GETCGILIST|
GETCGIVALUE| GETCODEPAGES| GETCOLLATIONS| GETCONFIGVALUE| 
GETDOUBLE| GETFILE| GETFLOAT| GETKEYVALUE| GETLICENSE| GETLONG|
GETPOINTERVALUE| GETSHORT| GETSIZE| GETSTRING| GETUNSIGNEDSHORT|
GLOBAL| GOON| GOPENDING| GRANT| GRAPHICEDGE| GROUP|
GTHAN| HANDLE| HAVING| HEADER| HEIGHT| HELP| HELPTOPIC|
HIDE| HINT| HORIZONTAL| HOSTBYTEORDER| HTMLENDOFLINE| HTMLFRAMEBEGIN| HTMLFRAMEEND|
HTMLHEADERBEGIN| HTMLHEADEREND| HTMLTITLEBEGIN| HTMLTITLEEND| IF| IMAGE| IMAGEDOWN| IMAGEINSENSITIVE|
IMAGESIZE| IMAGESIZECHARS| IMAGESIZEPIXELS| IMAGEUP| IMPORT| IN_KW| INCREMENTEXCLUSIVEID| INDEX| INDEXHINT|
INDEXEDREPOSITION| INDICATOR| INFORMATION| INITIAL| INITIALDIR| INITIALFILTER| INITIATE| INNER| INNERCHARS| INNERLINES|
INPUT| INPUTOUTPUT| INSERT| INTEGER| INTO| IS| ISATTRSPACE| ISLEADBYTE| ITEM| JOIN| JOINBYSQLDB| KBLABEL|
KEEPMESSAGES| KEEPTABORDER| KEY| KEYCODE| KEYFUNCTION| KEYLABEL| KEYS| KEYWORD| KEYWORDALL| LABEL| LABELBGCOLOR| 
LABELDCOLOR| LABELFGCOLOR| LABELFONT| LANDSCAPE|
LANGUAGES| LARGE| LARGETOSMALL| LAST| LASTEVENT| LASTOF| LASTKEY| LC| LDBNAME| 
LE| LEAVE| LEFT| LEFTALIGNED| LEFTTRIM| LENGTH| LIBRARY| LIKE| LINECOUNTER| LISTEVENTS| LISTITEMPAIRS| LISTITEMS|
LISTQUERYATTRS| LISTSETATTRS| LISTWIDGETS| LISTING| LITTLEENDIAN| LOAD| LOADPICTURE| LOCKED| LOG| LOGICAL| LONG| 
LOOKAHEAD| LOOKUP| LTHAN| 
MACHINECLASS| MAP| MARGINEXTRA| MATCHES| MAX| MAXCHARS| MAXROWS| MAXSIZE| MAXVALUE| MAXIMIZE| MAXIMUM| 
MEMBER| MEMPTR| MENU| MENUITEM| MENUBAR| MESSAGE| 
MESSAGELINE| MESSAGELINES| 
MIN| MINSIZE| MINVALUE| MINIMUM| MODULO|
MONTH| MOUSE|
MOUSEPOINTER| MPE| MULTIPLE| MULTIPLEKEY| MUSTEXIST| NATIVE| NE| NEW| NEXT| NEXTPROMPT| NEXTVALUE| NO| NOAPPLY| 
NOARRAYMESSAGE| NOASSIGN| NOATTRLIST| NOATTRSPACE| NOAUTOVALIDATE| NOBINDWHERE| NOBOX| NOCOLUMNSCROLLING| NOCONSOLE|
NOCONVERT| NOCONVERT3DCOLORS| NOCURRENTVALUE| NODEBUG| NODRAG| NOECHO| 
NOEMPTYSPACE| NOERROR_KW| NOFILL| NOFOCUS| NOHELP| NOHIDE| 
NOINDEXHINT| NOJOINBYSQLDB| NOLABELS| NOLOCK| NOLOOKAHEAD| NOMAP| NOMESSAGE| NONE| NOPAUSE| NOPREFETCH| 
NORETURNVALUE| NORMAL| NOROWMARKERS| NOSCROLLBARVERTICAL| NOSEPARATECONNECTION| NOSEPARATORS| NOTABSTOP| NOUNDERLINE|
NOUNDO| NOVALIDATE| NOWAIT| NOWORDWRAP| NOT| NULL_KW| NUMALIASES| NUMCOPIES| NUMDBS| NUMENTRIES|
NUMRESULTS| NUMERIC| OBJECT| OCTETLENGTH| OF| OFF| OK| OKCANCEL| OLD| ON| ONLY| OPEN| OPSYS| OPTION|
OR| ORDER| ORDEREDJOIN|
ORDINAL| OS2| OS400| OSAPPEND| OSCOMMAND| OSCOPY| OSCREATEDIR| OSDELETE| OSDIR| OSDRIVES| OSERROR|
OSGETENV| OSRENAME| OTHERWISE| OUTER| OUTERJOIN| OUTPUT| OVERLAY| OVERRIDE| PAGE| PAGEBOTTOM| PAGENUMBER| PAGESIZE_KW|
PAGETOP| PAGEWIDTH| PAGED| PARAMETER| PARENT| PARTIALKEY| PASCAL_KW| PAUSE| PDBNAME| PERFORMANCE| PERSISTENT| PFCOLOR|
PINNABLE| PORTRAIT| POSITION| PRECISION| PREPROCESS| PRESELECT| PREV| PRIMARY| PRINTER| PRINTERSETUP| PRIVATE|
PRIVILEGES| PROCTEXT| PROCTEXTBUFFER| PROCHANDLE| PROCSTATUS| PROCEDURE| PROCESS| PROFILER | PROGRAMNAME|
PROGRESS| PROMPT| PROMPTFOR| PROMSGS| PROPATH| PROVERSION| PUBLIC| PUBLISH| PUT| PUTBITS| PUTBYTE| PUTBYTES|
PUTDOUBLE| PUTFLOAT| PUTKEYVALUE| PUTLONG| PUTSHORT| PUTSTRING| QUERY| QUERYCLOSE| QUERYOFFEND|
QUERYTUNING| QUESTION| QUIT| QUOTER | RINDEX| RADIOBUTTONS| RADIOSET| RANDOM| RAW| RAWTRANSFER|
RCODEINFORMATION| READ| READAVAILABLE| READEXACTNUM|
READONLY| READKEY| REAL| RECID| RECORDLENGTH| RECTANGLE| RECURSIVE| RELEASE|
REPEAT| REPLACE| REPLICATIONCREATE| REPLICATIONDELETE| REPLICATIONWRITE|
REPOSITION| REPOSITIONFORWARD| REPOSITIONBACKWARD| REPOSITIONTOROW| REPOSITIONTOROWID|
REQUEST| RESULT| RETAIN| RETAINSHAPE| RETRY| RETRYCANCEL| RETURN|
RETURNTOSTARTDIR| RETURNVALUE| RETURNS| REVERSEFROM|
REVERT| REVOKE| RGBVALUE| RIGHT| RIGHTALIGNED| RIGHTTRIM| ROUND| ROW|
ROWHEIGHTCHARS| ROWHEIGHTPIXELS| ROWID| ROWOF| RULE| RUN| RUNPROCEDURE| SAVE| SAVECACHE| SAVEAS| SAXREADER|
SCHEMA| SCREEN| SCREENIO| SCREENLINES| SCROLL| SCROLLABLE| SCROLLBARHORIZONTAL| SCROLLBARVERTICAL|
SCROLLING| SDBNAME| SEARCH| SEARCHSELF| SEARCHTARGET| SECTION| SEEK| SELECT| SELECTION| SELECTIONLIST| SELF| SEND| 
SENDSQLSTATEMENT| SEPARATECONNECTION| SEPARATORS| SERVER| SERVERSOCKET| SESSION| SET| SETBYTEORDER| SETCONTENTS| 
SETCURRENTVALUE| SETPOINTERVALUE|
SETSIZE| SETUSERID| SHARELOCK| SHARED| SHOWSTATS| SIDELABELS| SILENT| SIMPLE| SINGLE|
SIZE| SIZECHARS| SIZEPIXELS| SKIP| SKIPDELETEDRECORD|
SLIDER| SMALLINT| SOCKET| SOME| SORT| SOURCE| SOURCEPROCEDURE|
SPACE| SQL| SQRT| START| STARTMOVE| STARTRESIZE| STARTROWRESIZE| STATUS| STATUSBAR| STDCALL_KW| STRETCHTOFIT|
STOP| STOREDPROCEDURE| STREAM| STREAMIO| STRING| STRINGXREF| SUBAVERAGE| SUBCOUNT| SUBMAXIMUM| SUBMENU|
SUBMENUHELP| SUBMINIMUM| SUBTOTAL| SUBSCRIBE| SUBSTITUTE| SUBSTRING| SUM| SUMMARY| SUPER| SYSTEMDIALOG| SYSTEMHELP| 
TABLE| TABLEHANDLE| TABLENUMBER| TARGET| TARGETPROCEDURE| TEMPTABLE| TERMINAL| TERMINATE| TEXT| 
TEXTCURSOR| TEXTSEGGROW|
THEN| THISPROCEDURE| THREED| THROUGH| TICMARKS| TIME| TITLE| TO| TOOLTIP| TOP| TOROWID| TODAY| TOGGLEBOX| 
TOOLBAR|
TOPONLY| TOPIC| TOTAL| TRANSACTION| TRANSACTIONMODE| TRANSPARENT| TRAILING| TRIGGER| TRIGGERS| TRIM| TRUE_KW| 
TRUNCATE| UNBUFFERED| UNDERLINE| UNDO| UNFORMATTED| UNLESSHIDDEN| 
UNION| UNIQUE| UNIQUEMATCH| UNIX| UNLOAD| UNSUBSCRIBE| 
UP| UPDATE| URLDECODE| URLENCODE| USE| USEDICTEXPS| USEFILENAME| USEINDEX| 
USEREVVIDEO| USETEXT| USEUNDERLINE| USER| USERID| USING| 
V6FRAME| VALIDEVENT| VALIDHANDLE| VALIDATE| VALUE| VALUECHANGED| VALUES| VARIABLE| VERBOSE| VERTICAL| VIEW| VIEWAS| 
VMS| WAITFOR| WARNING| WEBCONTEXT| WEEKDAY| WHEN| WHERE| WHILE| WIDGET| WIDGETHANDLE| WIDGETPOOL| WIDTH|
WIDTHCHARS| WIDTHPIXELS| WINDOW| WINDOWDELAYEDMINIMIZE|
WINDOWMAXIMIZED| WINDOWMINIMIZED| WINDOWNAME| WINDOWNORMAL| WITH| 
WORDINDEX| WORKTABLE| WRITE| X| XDOCUMENT| XNODEREF| XOF| XCODE| XREF| Y| YOF| YEAR| YES| YESNO| YESNOCANCEL
	;

unreservedkeyword
	:
AACBIT | AACONTROL | AALIST | AAMEMORY | AAMSG | AAPCONTROL | AASERIAL | AATRACE |
ABSOLUTE | ACCELERATOR | ADVISE | ALERTBOX | ALLOWREPLICATION | ALTERNATEKEY |
ANALYZE | ANSIONLY | ANYWHERE | APPEND | 
APPLICATION | ARRAYMESSAGE | AS | ASC | ASKOVERWRITE | ASYNCHRONOUS | ATTACHMENT |
AUTOCOMPLETION | AUTOENDKEY | AUTOGO | AUTOMATIC |
AVERAGE | AVG | BACKWARDS | BASEKEY | BGCOLOR | BINARY | BINDWHERE | BOTH | BOTTOM | BROWSE | BTOS | BUFFER | 
BUFFERCHARS | BUFFERLINES | BUFFERNAME | BUTTON | BUTTONS | BYTE | CACHE | CACHESIZE | CANQUERY | CANSET | 
CANCELBUTTON | CAPS | CDECL_KW | CHAINED | CHARACTER | CHARACTERLENGTH | CHOOSE | CLOSE | 
CODEBASELOCATOR | CODEPAGECONVERT | COLLATE |
COLOF | COLONALIGNED | COLORTABLE | COLUMN | COLUMNBGCOLOR | COLUMNDCOLOR | COLUMNFGCOLOR | COLUMNFONT | COLUMNOF | 
COLUMNPFCOLOR | COLUMNS | COMHANDLE | COMBOBOX | COMMAND | COMPARES | COMPLETE | COMPILE | CONFIGNAME | CONNECT | 
CONTAINS | CONTENTS | CONTEXT | CONTEXTHELP | CONTEXTHELPFILE | CONTEXTHELPID | 
CONTEXTPOPUP | CONTROLFRAME | CONVERT | CONVERT3DCOLORS | COUNT | 
CREATETESTFILE | CURRENTENVIRONMENT | CURRENTRESULTROW | CURRENTVALUE | 
DATABIND | DATE | DAY | DBIMS | DCOLOR | DEBUG | DECIMAL | 
DEFAULTBUTTON | DEFAULTEXTENSION | DEFAULTNOXLATE | DEFERLOBFETCH |
DEFINED | DELETEPROCEDURE | DELETERESULTLISTENTRY | DESC | 
DESELECTION | DIALOGBOX | DIALOGHELP |
DIR | DISABLED | DOUBLE | DROPDOWN | DROPDOWNLIST | DROPFILENOTIFY | DROPTARGET | 
DUMP | DYNAMIC | ECHO | EDGECHARS | EDGEPIXELS | EDITUNDO | EDITOR | EMPTY | ENDMOVE | ENDRESIZE | ENDROWRESIZE | 
ENDKEY | ENTERED | EQ | ERROR | EVENTPROCEDURE | EVENTS | EXCLUSIVEID | EXCLUSIVEWEBUSER | EXECUTE | EXP | EXPAND | 
EXPANDABLE | EXPLICIT | EXTENDED | EXTENT | EXTERNAL | 
FGCOLOR | FILE | FILLIN | FILTERS | FINDER | FITLASTCOLUMN | FIXEDONLY | 
FLATBUTTON | FLOAT | FONTTABLE | FORCEFILE | FORMINPUT | FORWARDS | FREQUENCY | FROMCURRENT | FUNCTION | 
GE | GENERATEMD5 | GET | GETBITS | GETBYTE | GETBYTES | GETBYTEORDER | GETCGILIST | 
GETCGIVALUE | GETCONFIGVALUE | GETDOUBLE | 
GETFILE | GETFLOAT | GETLICENSE |
GETLONG | GETPOINTERVALUE | GETSHORT | GETSIZE | GETSTRING | GETUNSIGNEDSHORT | GTHAN | HANDLE | HEIGHT |
HELPTOPIC | HINT |
HORIZONTAL | HTMLENDOFLINE | HTMLFRAMEBEGIN | HTMLFRAMEEND | HTMLHEADERBEGIN | HTMLHEADEREND | HTMLTITLEBEGIN | 
HTMLTITLEEND | IMAGE | IMAGEDOWN | IMAGEINSENSITIVE | IMAGESIZE | IMAGESIZECHARS | IMAGESIZEPIXELS | 
IMAGEUP | INCREMENTEXCLUSIVEID | INDEXHINT | INDEXEDREPOSITION | INFORMATION | INITIAL | INITIALDIR | 
INITIALFILTER | INITIATE | INNER | INNERCHARS | INNERLINES | INTEGER | ITEM | 
JOINBYSQLDB | KEEPMESSAGES | KEEPTABORDER | 
KEY | KEYCODE | KEYFUNCTION | KEYLABEL | KEYWORDALL | LABELBGCOLOR | LABELDCOLOR | LABELFGCOLOR | LABELFONT | 
LANDSCAPE | LANGUAGES | LARGE | LARGETOSMALL | LC | LE | LEFT | 
LEFTALIGNED | LEFTTRIM | LENGTH | LISTEVENTS | LISTITEMPAIRS | 
LISTITEMS | LISTQUERYATTRS | LISTSETATTRS | LISTWIDGETS | LOAD | LOADPICTURE | LOG | LOGICAL | LONG | LOOKAHEAD | 
LTHAN | MACHINECLASS | MARGINEXTRA | MATCHES | MAX | MAXCHARS | 
MAXROWS | MAXSIZE | MAXVALUE | MAXIMIZE | MAXIMUM | MEMPTR | MENU | 
MENUITEM | MENUBAR | MESSAGELINE |
MIN | MINSIZE | MINVALUE | MINIMUM | MODULO | MONTH | MOUSE | MOUSEPOINTER | MPE | MULTIPLE | 
MULTIPLEKEY | MUSTEXIST | NATIVE | NE | NEXTVALUE | NOAPPLY | NOARRAYMESSAGE | NOASSIGN | NOAUTOVALIDATE | 
NOBINDWHERE | NOBOX | NOCOLUMNSCROLLING | NOCONSOLE | NOCONVERT | NOCONVERT3DCOLORS | NOCURRENTVALUE | NODEBUG | 
NODRAG | NOECHO | NOEMPTYSPACE | 
NOINDEXHINT | NOJOINBYSQLDB | NOLOOKAHEAD | NONE | NORMAL | NOROWMARKERS | NOSCROLLBARVERTICAL | 
NOSEPARATECONNECTION | NOSEPARATORS | NOTABSTOP | NOUNDERLINE | NOWORDWRAP | NUMCOPIES | NUMRESULTS | NUMERIC | 
OBJECT | OCTETLENGTH | OK | OKCANCEL | ONLY | ORDER | ORDEREDJOIN | ORDINAL |
OS2 | OS400 | OSDRIVES | OSERROR | OSGETENV | OUTER | OUTERJOIN | OVERRIDE | PAGESIZE_KW | 
PAGEWIDTH | PAGED | PARENT | PARTIALKEY | PASCAL_KW | PERFORMANCE |
PFCOLOR | PINNABLE | PORTRAIT | POSITION | PRECISION | PRESELECT | PREV | PRIMARY | 
PRINTER | PRINTERSETUP | PRIVATE | PROCTEXT | PROCTEXTBUFFER | PROCEDURE | 
PROFILER | PROMPT | PUBLIC | PUBLISH | PUTBITS | 
PUTBYTES | PUTDOUBLE | PUTFLOAT | PUTLONG | PUTSHORT | PUTSTRING | QUESTION | RADIOBUTTONS | RADIOSET | RANDOM | 
RAW | RAWTRANSFER | READ | 
READONLY | REAL | RECORDLENGTH | RECURSIVE | REPLACE | 
REPLICATIONCREATE | REPLICATIONDELETE | REPLICATIONWRITE | REPOSITIONFORWARD | 
REQUEST | RESULT | RETAINSHAPE | RETRYCANCEL | RETURNTOSTARTDIR | 
RETURNVALUE | REVERSEFROM | RGBVALUE | RIGHT | RIGHTALIGNED | RIGHTTRIM | ROUND | 
ROW | ROWHEIGHTCHARS | ROWHEIGHTPIXELS | ROWID | ROWOF | RULE | RUNPROCEDURE | SAVECACHE | SAVEAS | SAXREADER | SCROLLABLE | 
SCROLLBARHORIZONTAL | SCROLLBARVERTICAL | SCROLLING | SECTION | SELECTION | SELECTIONLIST | SEND | SENDSQLSTATEMENT | 
SEPARATECONNECTION | SEPARATORS | SERVER | SERVERSOCKET | SETBYTEORDER | SETCONTENTS | SETCURRENTVALUE | 
SETPOINTERVALUE |
SETSIZE | SIDELABELS | SILENT | SIMPLE | SINGLE | SIZE | SIZECHARS | SIZEPIXELS | SLIDER | SMALLINT | SOCKET | 
SORT | SOURCE | SOURCEPROCEDURE | SQL | SQRT | START | STARTMOVE | STARTRESIZE | 
STARTROWRESIZE | STATUSBAR | STDCALL_KW | 
STRETCHTOFIT | STOP | STOREDPROCEDURE | STRING | STRINGXREF | SUBAVERAGE | SUBCOUNT | SUBMAXIMUM | SUBMENU | 
SUBMENUHELP | SUBMINIMUM | SUBTOTAL | SUBSCRIBE | SUBSTITUTE | SUBSTRING | SUM | 
SUMMARY | SUPER | SYSTEMHELP | TARGET | 
TARGETPROCEDURE | TEMPTABLE | TERMINATE | TEXTCURSOR | 
TEXTSEGGROW | THREED | THROUGH | TICMARKS | TODAY | TOGGLEBOX |
TOOLBAR | TOOLTIP | 
TOP | TOPIC | TOTAL | TRANSACTIONMODE | TRANSPARENT | TRAILING | 
TRUNCATE | UNBUFFERED | UNIQUEMATCH | UNLOAD | UNSUBSCRIBE | 
URLDECODE | URLENCODE | USE | USEDICTEXPS | USEFILENAME | 
USEREVVIDEO | USETEXT | USEUNDERLINE | USER | VALIDEVENT | VALIDHANDLE | 
VALIDATE | VARIABLE | VERBOSE | VERTICAL | VMS | WARNING | WEBCONTEXT | WEEKDAY | WIDGET | WIDGETHANDLE | WIDGETPOOL | 
WIDTH | WIDTHCHARS | WIDTHPIXELS | WINDOWNAME | WORDINDEX | 
X | XDOCUMENT | XNODEREF | XOF | Y | YOF | YEAR | YESNO | YESNOCANCEL
	;



///////////////////////////////////////////////////////////////////////////////////////////////////
// Begin SQL
///////////////////////////////////////////////////////////////////////////////////////////////////

altertablestate
	:	#(	ALTER TABLE RECORD_NAME
			(	ADD COLUMN sql_col_def
			|	DROP COLUMN field
			|	ALTER COLUMN field
				(  	#(FORMAT expression)
				|	label_constant
     				|	#(DEFAULT expression )
				| 	casesens_or_not
   				)*
			)
			state_end
		)
	;

closestate
	:	#(CLOSE ID state_end )
	;

createindexstate
	:	#(CREATE (UNIQUE)? INDEX ID ON RECORD_NAME #(Field_list LEFTPAREN field (COMMA field)* RIGHTPAREN ) state_end )
	;

createtablestate
	:	#(	CREATE TABLE ID 
			LEFTPAREN
			(	sql_col_def
			|	#(UNIQUE LEFTPAREN ID (COMMA ID)* RIGHTPAREN)
			)
			(	COMMA
				(	sql_col_def
				|	#(UNIQUE LEFTPAREN ID (COMMA ID)* RIGHTPAREN)
				)
			)*
			RIGHTPAREN
			state_end
		)
	;

createviewstate
	:	#(CREATE VIEW ID (#(Field_list LEFTPAREN field (COMMA field)* RIGHTPAREN ))? AS selectstatea state_end )
	;

declarecursorstate
	:	#(DECLARE ID CURSOR FOR selectstatea (#(FOR (#(READ (ONLY)?) | UPDATE)))? state_end )
	;

deletefromstate
	:	#(	DELETE_KW FROM RECORD_NAME
			( #(WHERE (sqlexpression | #(CURRENT OF ID))? ) )?
			state_end
		)
	;

dropindexstate
	:	#(DROP INDEX ID state_end )
	;

droptablestate
	:	#(DROP TABLE RECORD_NAME state_end )
	;

dropviewstate
	:	#(DROP VIEW ID state_end )
	;

fetchstate
	:	#(FETCH ID INTO field (fetch_indicator)? (COMMA field (fetch_indicator)? )* state_end )
	;
fetch_indicator
	:	#(INDICATOR field )
	|	field
	;

grantstate
	: 	#(GRANT (grant_rev_opt) ON (RECORD_NAME|ID) grant_rev_to (WITH GRANT OPTION)? state_end )
	;
grant_rev_opt
	:	#(ALL (PRIVILEGES)? )
	|	(	SELECT | INSERT | DELETE_KW
		|	#(UPDATE (#(Field_list LEFTPAREN field (COMMA field)* RIGHTPAREN ))? )
		|	COMMA
		)+
	;
grant_rev_to
	:	#(TO (PUBLIC | FILENAME (COMMA FILENAME)*) )
	|	#(FROM (PUBLIC | FILENAME (COMMA FILENAME)*) )
	;

insertintostate
	:	#(	INSERT INTO RECORD_NAME
			(#(Field_list LEFTPAREN field (COMMA field)* RIGHTPAREN ))?
			(	#(	VALUES LEFTPAREN sqlexpression (fetch_indicator)?
					(COMMA sqlexpression (fetch_indicator)?)* RIGHTPAREN
				)
			|	selectstatea
			)
			state_end
		)
	;

openstate
	: 	#(OPEN ID state_end )
	;

revokestate
	: 	#(REVOKE (grant_rev_opt) ON (RECORD_NAME|ID) grant_rev_to state_end )
	;

selectstate
	: 	selectstatea state_end
	;

selectstatea
	:	#(	SELECT
			(ALL | DISTINCT)?
			(	STAR
			|	#(	Sql_select_what
					(	(LEFTPAREN)=> LEFTPAREN sqlexpression (formatphrase)? RIGHTPAREN (formatphrase)?
					|	sqlexpression (formatphrase)?
					)
					(COMMA sqlexpression (formatphrase)?)*
				)
			)
			( #(INTO field (fetch_indicator)? (COMMA field (fetch_indicator)?)* ) )?
			#(FROM select_from_spec (COMMA select_from_spec)* )
			( #(GROUP BY expression (COMMA expression)* ) )?
			( #(HAVING sqlexpression) )?
			(	#(ORDER BY select_order_expr )
			|	#(BY select_order_expr )
			)?
			// Ick. I had trouble convincing antlr not to check the syntactic predicate
			// if next token _t was null.
			(	{_t != null}? ( ( #(WITH CHECK OPTION ) )=>{_t != null}? #(WITH CHECK OPTION ) | )
			|	// empty alt
			)
			(framephrase)?
			( #(UNION (ALL)? selectstatea) )?
		)
	;
select_from_spec
	:	select_sqltableref
		(	#(LEFT (OUTER)? JOIN select_sqltableref ON sqlexpression )
		|	#(RIGHT (OUTER)? JOIN select_sqltableref ON sqlexpression )
		|	#(INNER JOIN select_sqltableref ON sqlexpression )
		|	#(OUTER JOIN select_sqltableref ON sqlexpression )
		|	#(JOIN select_sqltableref ON sqlexpression )
		)*
		( #(WHERE sqlexpression) )?
	;
select_sqltableref
	:	(RECORD_NAME | ID) (ID)?
	;
select_order_expr
	:	sqlscalar (ASC|DESCENDING)? (COMMA sqlscalar (ASC|DESCENDING)?)*
	;

sqlupdatestate
	: 	#(	UPDATE RECORD_NAME SET sqlupdate_equal (COMMA sqlupdate_equal)*
			( #(WHERE (sqlexpression | CURRENT OF ID) ) )?
			state_end
		)
	;
sqlupdate_equal
	:	#(EQUAL field sqlexpression (fetch_indicator)? )
	;

///////////////////////////////////////////////////////////////////////////////////////////////////
// sql functions and phrases
///////////////////////////////////////////////////////////////////////////////////////////////////

sqlaggregatefunc
// also see maximumfunc and minimumfunc
	:	#(AVG sqlaggregatefunc_arg )
	|	#(COUNT sqlaggregatefunc_arg )
	|	#(SUM sqlaggregatefunc_arg )
	;
sqlaggregatefunc_arg
	:	LEFTPAREN
		(	DISTINCT
			(	LEFTPAREN field RIGHTPAREN
			|	field
			)
		|	STAR
		|	(ALL)? sqlscalar
		)
		RIGHTPAREN
	;

sql_col_def
	:	#(	ID
			(keyword | ID)
			(PRECISION)?
			(LEFTPAREN NUMBER (COMMA NUMBER)? RIGHTPAREN)?
			( #(Not_null NOT NULL_KW (UNIQUE)? ) )?
			(	label_constant
			|	#(DEFAULT expression )
			|  	#(FORMAT expression)
			| 	casesens_or_not
			)*
		)
	;



///////////////////////////////////////////////////////////////////////////////////////////////////
// sqlexpression 
///////////////////////////////////////////////////////////////////////////////////////////////////

sqlexpression
	:	#(OR sqlexpression sqlexpression )
	|	#(AND sqlexpression sqlexpression )
	|	#(NOT sqlexpression )
	|	#(MATCHES	sqlscalar (sqlscalar | sql_comp_query) )
	|	#(BEGINS	sqlscalar (sqlscalar | sql_comp_query) )
	|	#(CONTAINS	sqlscalar (sqlscalar | sql_comp_query) )
	|	#(EQ		sqlscalar (sqlscalar | sql_comp_query) )
	|	#(NE		sqlscalar (sqlscalar | sql_comp_query) )
	|	#(GTHAN		sqlscalar (sqlscalar | sql_comp_query) )
	|	#(GE		sqlscalar (sqlscalar | sql_comp_query) )
	|	#(LTHAN		sqlscalar (sqlscalar | sql_comp_query) )
	|	#(LE		sqlscalar (sqlscalar | sql_comp_query) )
	|	#(EXISTS LEFTPAREN selectstatea RIGHTPAREN )
	|	#(Sql_begins (NOT)? BEGINS sqlscalar )
	|	#(Sql_between (NOT)? BETWEEN sqlscalar AND sqlscalar )
	|	#(Sql_in (NOT)? IN_KW LEFTPAREN (selectstatea | sql_in_val (COMMA sql_in_val)*) RIGHTPAREN )
	|	#(Sql_like (NOT)? LIKE sqlscalar (ESCAPE sqlscalar)? )
	|	#(Sql_null_test IS (NOT)? NULL_KW )
	|	sqlscalar
	;
sql_comp_query
	:	#(Sql_comp_query (ANY|ALL|SOME)? LEFTPAREN selectstatea RIGHTPAREN )
	;
sql_in_val
	:	field (fetch_indicator)? | constant | USERID
	;
sqlscalar
	:	#(PLUS sqlscalar sqlscalar )
	|	#(MINUS sqlscalar sqlscalar )
	|	#(MULTIPLY sqlscalar sqlscalar )
	|	#(DIVIDE sqlscalar sqlscalar )
	|	#(MODULO sqlscalar sqlscalar )
	|	#(UNARY_PLUS exprt )
	|	#(UNARY_MINUS exprt )
	|	(LEFTPAREN)=> #(LEFTPAREN sqlexpression RIGHTPAREN )
	|	exprt
	;