Greetings - Here is the latest grammar from last night passed through http://lab.antlr.org/ with no errors. The grammar is not complete, but it will parse the clarion minimal program.
Regards,
Roberto Artigas
grammar ClarionGrammar;
options { caseInsensitive = true; }
// Parser rules
program
: programHeader
lineEnd* // allow blank lines after PROGRAM
mapSection?
(lineEnd | declarationSection)* // allow interleaved blank lines and declarations
codeSection
lineEnd* // allow trailing blank lines
EOF
;
programHeader
: PROGRAM
;
lineEnd
: EOL
| NEWLINE
;
// MAP section
mapSection
: MAP mapEntry* (END | DOT)
;
mapEntry
: moduleDecl
| prototypeDecl
;
moduleDecl
: MODULE LPAREN expr? RPAREN lineEnd?
prototypeDecl*
(END | DOT)
;
// MAP prototypes
prototypeDecl
: ID LPAREN prototypeParamList? RPAREN (COMMA returnType)? (COMMA PROC)? lineEnd?
;
prototypeParamList
: prototypeParam (COMMA prototypeParam)*
;
prototypeParam
: ( STAR typeSpec
| typeSpec
| LT STAR typeSpec GT
| LT typeSpec GT
)
(EQUAL expr)?
;
// Types
typeSpec
: BYTE
| SHORT
| USHORT
| LONG
| ULONG
| DECIMAL
| PDECIMAL
| REAL
| SREAL
| BFLOAT8
| BFLOAT4
| STRINGKW
| CSTRING
| BSTRING
| PSTRING
| USTRING
| BLOB
| MEMO
| DATE
| TIME
| BOOL
| GROUP
| QUEUE
| FILE
| VIEW
| WINDOW
| VARIANT
| ANY
| refType
| ID
| QUESTION // allow ? as a parameter type
;
// Reference types: &BYTE, &STRING, &QUEUE, &FILE, &VIEW, &WINDOW, etc.
refType
: AMP (
BYTE
| SHORT
| USHORT
| LONG
| ULONG
| DATE
| TIME
| REAL
| SREAL
| BFLOAT8
| BFLOAT4
| DECIMAL
| PDECIMAL
| STRINGKW
| CSTRING
| PSTRING
| GROUP
| QUEUE
| FILE
| KEYKW
| BLOB
| VIEW
| WINDOW
| USTRING
| BSTRING
| VARIANT
)
;
builtinType
: BYTE
| SHORT
| USHORT
| LONG
| ULONG
| DECIMAL
| PDECIMAL
| REAL
| SREAL
| BFLOAT8
| BFLOAT4
| STRINGKW
| CSTRING
| BSTRING
| PSTRING
| USTRING
| BLOB
| MEMO
| DATE
| TIME
| BOOL
| GROUP
| QUEUE
| FILE
| VIEW
| WINDOW
| VARIANT
| ANY
;
// Data type arguments and STRING/DECIMAL/PDECIMAL syntax
dataLikeOrType
: LIKE LPAREN fieldRef RPAREN
| STRINGKW stringTypeArgs?
| typeSpec typeArgs?
;
// DECIMAL/PDECIMAL and generic arg lists (trimmed ambiguity)
typeArgs
: LPAREN argList? RPAREN
;
// STRING( string-constant | length-expr | picture )
stringTypeArgs
: LPAREN stringArg RPAREN
;
stringArg
: STRING // string constant
| PICTURE // picture like @s10, @n3
| expr // length expression
;
// Procedure parameter lists for PROCEDURE / methods
procedureProtoParamList
: procedureProtoParam (COMMA procedureProtoParam)*
;
procedureProtoParam
: typeSpec (ID)? (EQUAL expr)?
;
// Declarations
declarationSection
: dataDecl
| likeNewDecl
| queueDecl
| windowDecl
| reportDecl
| procedureDecl
| labelDecl
| itemizeDecl
| recordDecl
| groupDecl
| fileDecl
| viewDecl
| interfaceDecl
| classDecl
| keywordDecl
;
// DATA
dataDecl
: ID dataLikeOrType? (COMMA dataAttr)* lineEnd
;
// LIKE-only declaration
likeNewDecl
: LIKE LPAREN fieldRef RPAREN (COMMA dataAttr)* lineEnd
;
argList
: expr (COMMA expr)*
;
dataAttr
: PRE LPAREN ID RPAREN
| USE LPAREN fieldRef RPAREN
| DIM LPAREN expr (COMMA expr)* RPAREN
| OVER LPAREN fieldRef RPAREN
| STATIC
| PRIVATE
| THREAD
| AUTO
| BINARYKW
| EXTERNAL
| DLL LPAREN argList? RPAREN
| PROTECTED
| ID (LPAREN argList? RPAREN)?
;
// QUEUE
queueDecl
: ID QUEUE queueTypeArgs? (COMMA queueAttr)* lineEnd
queueFieldDecl+
(END | DOT)
;
queueTypeArgs
: LPAREN fieldRef? RPAREN
;
queueAttr
: PRE (LPAREN ID RPAREN)?
| STATIC
| THREAD
| TYPEKW
| BINDABLE
| EXTERNAL
| DLL (LPAREN argList? RPAREN)?
| ID (LPAREN argList? RPAREN)?
;
queueFieldDecl
: ID dataLikeOrType? (COMMA dataAttr)* lineEnd
;
// WINDOW
windowDecl
: ID WINDOW windowArgs? lineEnd
windowMenuBarSection?
windowToolBarSection?
windowControlDecl*
(END | DOT)
;
windowArgs
: LPAREN argList? RPAREN (COMMA windowAttr)*
;
windowAttr
: ATKW LPAREN argList? RPAREN
| FONTKW LPAREN argList? RPAREN
| ICONKW LPAREN argList? RPAREN
| STATUSKW LPAREN argList? RPAREN
| HLPKW LPAREN argList? RPAREN
| CURSORKW LPAREN argList? RPAREN
| TIMERKW LPAREN argList? RPAREN
| ALRTKW LPAREN argList? RPAREN
| MSGKW LPAREN argList? RPAREN
| PALETTEKW LPAREN argList? RPAREN
| DROPIDKW LPAREN argList? RPAREN
| DOCKKW LPAREN argList? RPAREN
| DOCKEDKW LPAREN argList? RPAREN
| LAYOUTKW LPAREN argList? RPAREN
| COLORKW LPAREN argList? RPAREN
| CENTER
| CENTERED
| SYSTEMKW
| MAXKW
| MDI
| MODAL
| MASK
| GRAY
| ICONIZE
| MAXIMIZE
| IMMKW
| AUTO
| TOOLBOX
| TILED
| HSCROLL
| VSCROLL
| NOFRAME
| HVSCROLL
| RESIZEKW
| DOUBLE
| ID (LPAREN argList? RPAREN)?
;
// MENUBAR / MENU / ITEM
windowMenuBarSection
: MENUBAR menubarArgs? lineEnd
menuBarEntry*
(END | DOT)
;
menubarArgs
: (COMMA menubarAttr)+
;
menubarAttr
: USE LPAREN argList? RPAREN
| NOMERGEKW
;
menuBarEntry
: menuDecl
| menuItemDecl
| windowMenuDecl
;
menuDecl
: MENU LPAREN argList? RPAREN menuArgs? lineEnd
menuEntry*
(END | DOT)
;
menuArgs
: (COMMA menuAttr)+
;
menuAttr
: ATKW LPAREN argList? RPAREN
| USE LPAREN argList? RPAREN
| KEYKW LPAREN argList? RPAREN
| MSGKW LPAREN argList? RPAREN
| HLPKW LPAREN argList? RPAREN
| STDKW (LPAREN argList? RPAREN)?
| RIGHTKW
| DISABLEKW
| COLORKW (LPAREN argList? RPAREN)?
| LEFTKW LPAREN argList? RPAREN
| HIDEKW
| ICONKW LPAREN argList? RPAREN
| FONTKW LPAREN argList? RPAREN
| FIRSTKW
| LASTKW
;
menuEntry
: menuItemDecl
| menuDecl
;
menuItemDecl
: ITEMKW LPAREN argList? RPAREN itemArgs? lineEnd
;
itemArgs
: (COMMA itemAttr)+
;
itemAttr
: ATKW LPAREN argList? RPAREN
| USE LPAREN argList? RPAREN
| KEYKW LPAREN argList? RPAREN
| MSGKW LPAREN argList? RPAREN
| HLPKW LPAREN argList? RPAREN
| STDKW
| CHECKKW
| DISABLEKW
| COLORKW
| LEFTKW LPAREN argList? RPAREN
| HIDEKW
| SEPARATORKW
| ICONKW LPAREN argList? RPAREN
| FONTKW LPAREN argList? RPAREN
| FIRSTKW
| LASTKW
;
windowMenuDecl
: ID (LPAREN argList? RPAREN)?
(COMMA ID (LPAREN argList? RPAREN)?)* lineEnd
;
// TOOLBAR
windowToolBarSection
: TOOLBAR toolbarArgs? lineEnd
windowControlDecl*
(END | DOT)
;
toolbarArgs
: (COMMA toolbarAttr)+
;
toolbarAttr
: ATKW LPAREN argList? RPAREN
| USE LPAREN argList? RPAREN
| CURSORKW LPAREN argList? RPAREN
| FONTKW LPAREN argList? RPAREN
| NOMERGEKW
| COLORKW
| LAYOUTKW (LPAREN argList? RPAREN)?
| WALLPAPERKW LPAREN argList? RPAREN
| TILED
| CENTERED
;
// Controls (WINDOW)
windowControlDecl
: oleControlDecl
| listControlDecl
| lineControlDecl
| sheetControlDecl
| optionControlDecl
| ID? PROMPTKW LPAREN argList? RPAREN controlAttrs lineEnd
| ID? BUTTON LPAREN argList? RPAREN controlAttrs lineEnd
| ID? STRINGKW LPAREN argList? RPAREN controlAttrs lineEnd
| ID? CHECKKW LPAREN argList? RPAREN controlAttrs lineEnd
| ID? IMAGE LPAREN argList? RPAREN controlAttrs lineEnd
| ID? PANEL LPAREN argList? RPAREN controlAttrs lineEnd
| ID? PROGRESS LPAREN argList? RPAREN controlAttrs lineEnd
| ID? REGION LPAREN argList? RPAREN controlAttrs lineEnd
| ID? SLIDER LPAREN argList? RPAREN controlAttrs lineEnd
| ID? SPIN LPAREN argList? RPAREN controlAttrs lineEnd
| ID? controlType controlAttrs lineEnd
;
// OPTION control with nested controls
optionControlDecl
: ID? OPTIONKW optionAttrs? lineEnd
windowControlDecl*
(END | DOT)
;
optionAttrs
: COMMA optionAttr (COMMA optionAttr)*
;
optionAttr
: ATKW LPAREN argList? RPAREN
| USE LPAREN argList? RPAREN
| FONTKW LPAREN argList? RPAREN
| COLORKW LPAREN argList? RPAREN
| BOXEDKW
| BEVELKW
| HIDEKW
| DISABLEKW
| ID (LPAREN argList? RPAREN)?
;
// Special OLE control with optional nested MENUBAR and END
oleControlDecl
: ID? OLE oleControlAttrs lineEnd
oleMenuBarSection?
(END | DOT)
;
oleControlAttrs
: COMMA ATKW LPAREN argList? RPAREN (COMMA controlAttr)*
;
oleMenuBarSection
: MENUBAR menubarArgs? lineEnd
menuBarEntry*
(END | DOT)
;
listControlDecl
: ID? LIST listControlAttrs lineEnd
;
listControlAttrs
: COMMA ATKW LPAREN argList? RPAREN (COMMA controlAttr)*
;
lineControlDecl
: ID? LINE lineControlAttrs lineEnd
;
lineControlAttrs
: COMMA ATKW LPAREN argList? RPAREN (COMMA controlAttr)*
;
// SHEET control with nested TABs
sheetControlDecl
: ID? SHEETKW sheetControlAttrs lineEnd
sheetTabDecl+
(END | DOT)
;
sheetControlAttrs
: COMMA sheetControlAttr (COMMA sheetControlAttr)*
;
sheetControlAttr
: ATKW LPAREN argList? RPAREN
| CURSORKW LPAREN argList? RPAREN
| USE LPAREN argList? RPAREN
| LAYOUTKW LPAREN argList? RPAREN
| DISABLEKW
| KEYKW LPAREN argList? RPAREN
| FULLKW
| SCROLLKW
| HIDEKW
| FONTKW LPAREN argList? RPAREN
| DROPIDKW LPAREN argList? RPAREN
| WIZARDKW
| SPREADKW
| HSCROLL
| JOINKW
| NOSHEETKW
| COLORKW LPAREN argList? RPAREN
| UPKW
| DOWNKW
| LEFTKW (LPAREN argList? RPAREN)?
| RIGHTKW (LPAREN argList? RPAREN)?
| ABOVEKW LPAREN argList? RPAREN
| BELOWKW LPAREN argList? RPAREN
| IMMKW
;
sheetTabDecl
: ID? TABKW LPAREN argList? RPAREN controlAttrs lineEnd
;
controlType
: BUTTON
| LIST
| ENTRY
| STRINGKW
| GROUP
| BOX
| LINE
| ELLIPSE
| OLE
| PROMPTKW
| RADIOKW
| SHEETKW
| TABKW
| CHECKKW
| PROGRESS
| REGION
| SLIDER
| SPIN
;
controlAttrs
: (COMMA controlAttr)+
;
// Attributes valid on controls
controlAttr
// positional / layout / binding / data source
: ATKW LPAREN argList? RPAREN
| CURSORKW LPAREN argList? RPAREN
| USE LPAREN argList? RPAREN
| LAYOUTKW LPAREN argList? RPAREN
| LAYOUTKW
| FONTKW LPAREN argList? RPAREN
| COLORKW LPAREN argList? RPAREN
| DROPIDKW LPAREN argList? RPAREN
| ANGLEKW LPAREN argList? RPAREN
| COMPATIBILITYKW LPAREN argList? RPAREN
| FROMKW LPAREN argList? RPAREN
| FORMATKW LPAREN argList? RPAREN
| DRAGIDKW LPAREN argList? RPAREN
| PENKW LPAREN argList? RPAREN
| STYLEKW LPAREN argList? RPAREN
| LINEWIDTHKW LPAREN argList? RPAREN
| LINEWIDTHKW
// basic behavioral flags
| DISABLEKW
| HIDEKW
| FULLKW
| SCROLLKW
| TRNKW
| SKIPKW
| DEFAULTKW
| IMMKW
| REQKW
| FLATKW
| LEFTKW
| RIGHTKW
| CENTER
| READONLYKW
| MASK
| INSKW
| UPRKW
| OVRKW
| CAPKW
// LIST/COMBO-specific simple flags
| DROPKW
| COLUMNKW
| VCRKW
| NOBARKW
| GRIDKW (LPAREN argList? RPAREN)?
// scroll flags usable on controls
| HSCROLL
| VSCROLL
| HVSCROLL
// BUTTON/menu-style attributes with params
| KEYKW LPAREN argList? RPAREN
| MSGKW LPAREN argList? RPAREN
| HLPKW LPAREN argList? RPAREN
| STDKW LPAREN argList? RPAREN
| ICONKW LPAREN argList? RPAREN
| TIPKW LPAREN argList? RPAREN
| ALRTKW LPAREN argList? RPAREN
| REPEATKW LPAREN argList? RPAREN
| DELAYKW LPAREN argList? RPAREN
// STRING/report-style aggregation / page counters (using MAXKW)
| PAGENOKW // PAGENO
| EXTENDKW LPAREN argList? RPAREN // EXTEND(...)
| CNTKW LPAREN argList? RPAREN // CNT(...)
| SUMKW LPAREN argList? RPAREN // SUM(...)
| AVEKW LPAREN argList? RPAREN // AVE(...)
| MINKW LPAREN argList? RPAREN // MIN(...)
| MAXKW LPAREN argList? RPAREN // MAX(...)
| RESETKW LPAREN argList? RPAREN // RESET(...)
| TALLYKW LPAREN argList? RPAREN // TALLY(...)
| PAGEKW // PAGE
| DECIMAL // DECIMAL flag
// LIST MARK attribute
| MARKKW LPAREN argList? RPAREN
// ellipse / box / line fill
| FILLKW LPAREN argList? RPAREN
// fallback custom attributes
| ID (LPAREN argList? RPAREN)?
;
// REPORT
reportDecl
: ID REPORTKW LPAREN argList? RPAREN
COMMA ATKW LPAREN argList? RPAREN
(COMMA reportAttr)* lineEnd
reportSection*
(END | DOT)
;
reportAttr
: FONTKW LPAREN argList? RPAREN
| PRE LPAREN ID RPAREN
| LANDSCAPEKW
| PREVIEWKW
| PAPERKW
| COLORKW LPAREN argList? RPAREN
| THOUS
| MMKW
| POINTSKW
| ID (LPAREN argList? RPAREN)?
;
reportSection
: reportFormSection
| reportHeaderSection
| reportDetailSection
| reportBreakSection
| reportFooterSection
;
reportFormSection
: FORMKW lineEnd
reportControlDecl*
(END | DOT)
;
reportHeaderSection
: HEADERKW lineEnd
reportControlDecl*
(END | DOT)
;
reportDetailSection
: ID DETAILKW lineEnd
reportControlDecl*
(END | DOT)
;
reportBreakSection
: ID BREAK LPAREN argList? RPAREN lineEnd
reportControlDecl*
(END | DOT)
;
reportFooterSection
: FOOTERKW lineEnd
reportControlDecl*
(END | DOT)
;
reportControlDecl
: ID? PROMPTKW LPAREN argList? RPAREN controlAttrs lineEnd
| ID? BUTTON LPAREN argList? RPAREN controlAttrs lineEnd
| ID? STRINGKW LPAREN argList? RPAREN controlAttrs lineEnd
| ID? CHECKKW LPAREN argList? RPAREN controlAttrs lineEnd
| ID? IMAGE LPAREN argList? RPAREN controlAttrs lineEnd
| ID? OLE oleControlAttrs lineEnd oleMenuBarSection? (END | DOT)
| ID? LINE lineControlAttrs lineEnd
| ID? controlType controlAttrs lineEnd
;
// Procedure prototypes and impls
procedureProtoDecl
: ID PROCEDUREKW (LPAREN procedureProtoParamList? RPAREN)?
(COMMA returnType)?
lineEnd
;
procedureDecl
: ID PROCEDUREKW (LPAREN procedureProtoParamList? RPAREN)?
(COMMA returnType)? lineEnd
declarationSection*
codeSection
;
returnType
: STAR? typeSpec
;
moduleDecl2
: MODULE LPAREN expr RPAREN lineEnd
prototypeDecl*
(END | DOT)
;
// Label / picture / type
labelDecl
: ID EQUATE LPAREN expr? RPAREN lineEnd
| PICTURE (COMMA labelAttr)* lineEnd
| builtinType lineEnd
;
labelAttr
: STATIC
| THREAD
| AUTO
| PRIVATE
| PROTECTED
;
// ITEMIZE
itemizeDecl
: ID? ITEMIZEKW LPAREN expr? RPAREN
(COMMA PRE LPAREN expr? RPAREN)?
lineEnd
itemizeEquate+
(END | DOT)
;
itemizeEquate
: ID EQUATE LPAREN expr? RPAREN lineEnd
;
// RECORD
recordDecl
: ID RECORD (COMMA recordAttr)* lineEnd
recordFieldDecl+
(END | DOT)
;
recordAttr
: PRE LPAREN ID RPAREN
| ID (LPAREN argList? RPAREN)?
;
recordFieldDecl
: ID dataLikeOrType? (COMMA dataAttr)* lineEnd
;
// GROUP
groupDecl
: ID? GROUP LPAREN fieldRef? RPAREN (COMMA groupAttr)* lineEnd
declarationSection*
(END | DOT)
;
groupAttr
: PRE LPAREN ID RPAREN
| DIM LPAREN expr (COMMA expr)* RPAREN
| OVER LPAREN fieldRef RPAREN
| ID (LPAREN argList? RPAREN)?
;
// FILE
fileDecl
: ID FILE (COMMA fileAttr)* lineEnd
fileEntry*
(END | DOT)
;
fileAttr
: PRE LPAREN ID RPAREN
| ID (LPAREN argList? RPAREN)?
;
fileEntry
: recordDecl
| fileKeyDecl
| fileIndexDecl
| fileMemoDecl
| fileBlobDecl
;
// VIEW declarations
viewDecl
: ID VIEW LPAREN fieldRef RPAREN (COMMA viewAttr)* lineEnd
viewSection*
(END | DOT)
;
viewAttr
: FILTERKW LPAREN expr RPAREN
| ORDERKW LPAREN expr RPAREN
;
viewSection
: projectSection
| joinSection
;
projectSection
: PROJECTKW LPAREN projectList? RPAREN lineEnd
;
projectList
: fieldRef (COMMA fieldRef)*
;
joinSection
: JOINKW LPAREN fieldRef RPAREN lineEnd
viewSection*
(END | DOT)
;
// FILE KEY
fileKeyDecl
: ID (KEYKW LPAREN keyFieldList RPAREN (COMMA keyAttr)*)? lineEnd
;
keyFieldList
: keyField (COMMA keyField)*
;
keyField
: (PLUS | MINUS)? fieldRef
;
keyAttr
: ID (LPAREN argList? RPAREN)?
;
fileIndexDecl
: ID (INDEXKW LPAREN argList? RPAREN)? lineEnd
;
fileMemoDecl
: ID (MEMO LPAREN argList? RPAREN)? lineEnd
;
fileBlobDecl
: ID (BLOB)? lineEnd
;
// INTERFACE
interfaceDecl
: ID INTERFACE LPAREN fieldRef? RPAREN
(COMMA TYPEKW)?
(COMMA COMKW)?
lineEnd
interfaceMethod*
(END | DOT)
;
interfaceMethod
: prototypeDecl
;
// CLASS
classDecl
: ID CLASSKW LPAREN fieldRef? RPAREN classAttrList? lineEnd
classMember*
(END | DOT)
;
classAttrList
: COMMA classAttr (COMMA classAttr)*
;
classAttr
: EXTERNAL
| IMPLEMENTS
| DLL LPAREN expr? RPAREN
| STATIC
| THREAD
| BINDABLE
| MODULE LPAREN expr? RPAREN
| LINKKW LPAREN expr? RPAREN
| TYPEKW
| DIM LPAREN expr RPAREN
| PARTIALKW
;
classMember
: dataDecl
| prototypeDecl
;
// KEYWORD construct
keywordDecl
: ID? KEYWORDKW LPAREN keywordParamList RPAREN keywordAttr* lineEnd
;
keywordParamList
: PIPE? expr (PIPE expr)* PIPE?
;
keywordAttr
: ID LPAREN argList? RPAREN
;
// CODE and statements
codeSection
: CODE lineEnd statement*
;
statement
: QUESTION? coreStatement
| lineEnd
;
coreStatement
: assignStmt
| procCallStmt
| doStmt
| ifStmt
| caseStmt
| executeStmt
| loopStmt
| acceptStmt
| breakStmt
| cycleStmt
| exitStmt
| routineStmt
| routineDataBlock
| codeMarkerStmt
| includeStmt
| returnStmt
| openCloseStmt
| lineFuncStmt
| ellipseFuncStmt
| imageFuncStmt
| gotoStmt
;
// Assignments / calls
assignStmt
: fieldRef (EQUAL | AMP_EQUAL | DEEP_ASSIGN | STAR_EQUAL | PLUS_EQUAL | DIV_EQUAL) expr lineEnd
;
procCallStmt
: fieldRef LPAREN argList? RPAREN lineEnd
;
doStmt
: DO fieldRef lineEnd
;
includeStmt
: INCLUDEKW LPAREN expr (COMMA expr)? RPAREN (COMMA ONCEKW)? lineEnd
;
// EXECUTE
executeStmt
: EXECUTE expr lineEnd
executeBranch+
executeElse?
(END | DOT)
;
executeBranch
: BEGIN lineEnd statement* (END | DOT)
| statement
;
executeElse
: ELSE lineEnd statement*
;
// IMAGE drawing function
imageFuncStmt
: IMAGE LPAREN imageArgs RPAREN lineEnd
;
imageArgs
: expr COMMA expr (COMMA expr)? (COMMA expr)? COMMA expr (COMMA argList)?
;
// IF
ifStmt
: IF expr (THEN)? lineEnd
statement*
elsifClause*
elseClause?
(END | DOT)
;
elsifClause
: ELSIF expr (THEN)? lineEnd
statement*
;
elseClause
: ELSE lineEnd
statement*
;
// CASE
caseStmt
: CASE expr lineEnd
caseBranch*
(ELSE lineEnd statement*)?
(END | DOT)
;
caseBranch
: OF caseLabel (OROF caseLabel)* lineEnd
statement*
;
caseLabel
: expr (TO expr)?
;
// LOOP
loopStmt
: (ID)? LOOP loopHead? lineEnd
statement*
loopTail?
(END | DOT)
;
loopHead
: expr TIMES
| ID EQUAL expr TO expr (BY expr)?
| UNTIL expr
| WHILE expr
;
loopTail
: UNTIL expr
| WHILE expr
;
// ACCEPT / BREAK / etc.
acceptStmt
: ACCEPT lineEnd statement* (END | DOT)
;
breakStmt
: BREAK (ID)? lineEnd
;
cycleStmt
: CYCLE (ID)? lineEnd
;
exitStmt
: EXIT lineEnd
;
routineStmt
: ID ROUTINE lineEnd
;
routineDataBlock
: DATAKW lineEnd
declarationSection*
;
codeMarkerStmt
: CODE lineEnd
;
returnStmt
: RETURN expr? lineEnd
;
openCloseStmt
: (OPEN | CLOSE) LPAREN fieldRef RPAREN lineEnd
;
// GOTO statement
gotoStmt
: GOTO ID lineEnd
;
// DRAW / LINE function-style syntax
lineFuncStmt
: LINE LPAREN lineCoordArgs RPAREN lineEnd
;
// ELLIPSE drawing function-style syntax
ellipseFuncStmt
: ELLIPSE LPAREN lineCoordArgs RPAREN lineEnd
;
lineCoordArgs
: expr COMMA expr COMMA expr COMMA expr (COMMA argList)?
;
// Expressions
expr
: orExpr
;
orExpr
: andExpr (OR andExpr)*
;
andExpr
: equalityExpr (AND equalityExpr)*
;
equalityExpr
: relationalExpr ((EQUAL | NEQ | AMP_EQUAL) relationalExpr)*
;
relationalExpr
: additiveExpr ((LT | LTE | GT | GTE) additiveExpr)*
;
additiveExpr
: multiplicativeExpr ((PLUS | MINUS | AMP) multiplicativeExpr)*
;
multiplicativeExpr
: powExpr ((STAR | DIV | PERCENT) powExpr)*
;
powExpr
: unaryExpr (CARET powExpr)?
;
unaryExpr
: (NOT | TILDE | MINUS) unaryExpr
| primary
;
primary
: primaryBase
( LBRACE propertyParamList RBRACE
| LBRACKET indexOrSlice RBRACKET
)*
;
primaryBase
: literal
| fieldRef
| ADDRESS LPAREN argList? RPAREN
| LIKE LPAREN argList? RPAREN
| POPUPKW LPAREN popupArgList RPAREN
| LINKNAMEKW LPAREN argList? RPAREN
| LINEWIDTHKW LPAREN argList? RPAREN
| LPAREN expr RPAREN
;
popupArgList
: expr (COMMA expr)? (COMMA expr)? (COMMA expr)?
;
indexOrSlice
: expr
| expr SLICE_COLON expr?
| SLICE_COLON expr?
;
propertyParamList
: expr (COMMA expr)*
;
literal
: INTLIT
| REALLIT
| STRING
| TRUE
| FALSE
| PICTURE
| NULLKW
;
// Field references
fieldRef
: ID (DOT ID)*
;
// Lexer rules
RECORD : 'RECORD';
PROGRAM : 'PROGRAM';
MAP : 'MAP';
MODULE : 'MODULE';
END : 'END';
CODE : 'CODE';
DATAKW : 'DATA';
BYTE : 'BYTE';
SHORT : 'SHORT';
USHORT : 'USHORT';
LONG : 'LONG';
ULONG : 'ULONG';
DECIMAL : 'DECIMAL';
PDECIMAL : 'PDECIMAL';
REAL : 'REAL';
SREAL : 'SREAL';
BFLOAT8 : 'BFLOAT8';
BFLOAT4 : 'BFLOAT4';
STRINGKW : 'STRING';
CSTRING : 'CSTRING';
BSTRING : 'BSTRING';
PSTRING : 'PSTRING';
USTRING : 'USTRING';
BLOB : 'BLOB';
MEMO : 'MEMO';
DATE : 'DATE';
TIME : 'TIME';
BOOL : 'BOOL';
QUEUE : 'QUEUE';
VIEW : 'VIEW';
WINDOW : 'WINDOW';
FILE : 'FILE';
GROUP : 'GROUP';
VARIANT : 'VARIANT';
ANY : 'ANY';
PRE : 'PRE';
USE : 'USE';
LIKE : 'LIKE';
DIM : 'DIM';
OVER : 'OVER';
STATIC : 'STATIC';
PRIVATE : 'PRIVATE';
THREAD : 'THREAD';
AUTO : 'AUTO';
BINARYKW : 'BINARY';
BUTTON : 'BUTTON';
LIST : 'LIST';
ENTRY : 'ENTRY';
BOX : 'BOX';
PANEL : 'PANEL';
REGION : 'REGION';
LINE : 'LINE';
SLIDER : 'SLIDER';
SPIN : 'SPIN';
ELLIPSE : 'ELLIPSE';
IMAGE : 'IMAGE';
OLE : 'OLE';
PROMPTKW : 'PROMPT';
RADIOKW : 'RADIO';
SHEETKW : 'SHEET';
TABKW : 'TAB';
CHECKKW : 'CHECK';
COMBOKW : 'COMBO';
PROGRESS : 'PROGRESS';
OPTIONKW : 'OPTION';
BOXEDKW : 'BOXED';
BEVELKW : 'BEVEL';
PROC : 'PROC';
ACCEPT : 'ACCEPT';
CASE : 'CASE';
OF : 'OF';
OROF : 'OROF';
ELSE : 'ELSE';
ELSIF : 'ELSIF';
IF : 'IF';
THEN : 'THEN';
LOOP : 'LOOP';
BREAK : 'BREAK';
CYCLE : 'CYCLE';
EXIT : 'EXIT';
GOTO : 'GOTO';
ROUTINE : 'ROUTINE';
RETURN : 'RETURN';
OPEN : 'OPEN';
CLOSE : 'CLOSE';
DO : 'DO';
EXECUTE : 'EXECUTE';
BEGIN : 'BEGIN';
TRUE : 'TRUE';
FALSE : 'FALSE';
AND : 'AND';
OR : 'OR';
NOT : 'NOT';
TO : 'TO';
ADDRESS : 'ADDRESS';
EQUATE : 'EQUATE';
TIMES : 'TIMES';
WHILE : 'WHILE';
UNTIL : 'UNTIL';
BY : 'BY';
INTERFACE : 'INTERFACE';
TYPEKW : 'TYPE';
COMKW : 'COM';
CLASSKW : 'CLASS';
EXTERNAL : 'EXTERNAL';
IMPLEMENTS : 'IMPLEMENTS';
DLL : 'DLL';
BINDABLE : 'BINDABLE';
LINKKW : 'LINK';
PARTIALKW : 'PARTIAL';
PROCEDUREKW : 'PROCEDURE';
ITEMIZEKW : 'ITEMIZE';
INCLUDEKW : 'INCLUDE';
ONCEKW : 'ONCE';
KEYKW : 'KEY';
INDEXKW : 'INDEX';
NULLKW : 'NULL';
KEYWORDKW : 'KEYWORD';
PROTECTED : 'PROTECTED';
MENUBAR : 'MENUBAR';
TOOLBAR : 'TOOLBAR';
MENU : 'MENU';
ITEMKW : 'ITEM';
STDKW : 'STD';
RIGHTKW : 'RIGHT';
DISABLEKW : 'DISABLE';
LEFTKW : 'LEFT';
HIDEKW : 'HIDE';
FIRSTKW : 'FIRST';
LASTKW : 'LAST';
SEPARATORKW : 'SEPARATOR';
NOMERGEKW : 'NOMERGE';
WALLPAPERKW : 'WALLPAPER';
POPUPKW : 'POPUP';
LINKNAMEKW : 'LINKNAME';
FULLKW : 'FULL';
SCROLLKW : 'SCROLL';
TRNKW : 'TRN';
SKIPKW : 'SKIP';
DEFAULTKW : 'DEFAULT';
REQKW : 'REQ';
TIPKW : 'TIP';
FLATKW : 'FLAT';
REPEATKW : 'REPEAT';
DELAYKW : 'DELAY';
REPORTKW : 'REPORT';
ATKW : 'AT';
FONTKW : 'FONT';
COLORKW : 'COLOR';
CENTER : 'CENTER';
CENTERED : 'CENTERED';
SYSTEMKW : 'SYSTEM';
MAXKW : 'MAX';
ICONKW : 'ICON';
STATUSKW : 'STATUS';
HLPKW : 'HLP';
CURSORKW : 'CURSOR';
MDI : 'MDI';
MODAL : 'MODAL';
MASK : 'MASK';
GRAY : 'GRAY';
TIMERKW : 'TIMER';
ALRTKW : 'ALRT';
ICONIZE : 'ICONIZE';
MAXIMIZE : 'MAXIMIZE';
MSGKW : 'MSG';
PALETTEKW : 'PALETTE';
DROPIDKW : 'DROPID';
IMMKW : 'IMM';
TOOLBOX : 'TOOLBOX';
DOCKKW : 'DOCK';
DOCKEDKW : 'DOCKED';
LAYOUTKW : 'LAYOUT';
TILED : 'TILED';
HSCROLL : 'HSCROLL';
VSCROLL : 'VSCROLL';
NOFRAME : 'NOFRAME';
HVSCROLL : 'HVSCROLL';
RESIZEKW : 'RESIZE';
DOUBLE : 'DOUBLE';
FORMKW : 'FORM';
HEADERKW : 'HEADER';
DETAILKW : 'DETAIL';
FOOTERKW : 'FOOTER';
LANDSCAPEKW : 'LANDSCAPE';
PREVIEWKW : 'PREVIEW';
PAPERKW : 'PAPER';
THOUS : 'THOUS';
MMKW : 'MM';
POINTSKW : 'POINTS';
PAGENOKW : 'PAGENO';
EXTENDKW : 'EXTEND';
CNTKW : 'CNT';
SUMKW : 'SUM';
AVEKW : 'AVE';
MINKW : 'MIN';
TALLYKW : 'TALLY';
RESETKW : 'RESET';
PAGEKW : 'PAGE';
ANGLEKW : 'ANGLE';
COMPATIBILITYKW : 'COMPATIBILITY';
FROMKW : 'FROM';
FORMATKW : 'FORMAT';
DROPKW : 'DROP';
COLUMNKW : 'COLUMN';
VCRKW : 'VCR';
NOBARKW : 'NOBAR';
GRIDKW : 'GRID';
MARKKW : 'MARK';
DRAGIDKW : 'DRAGID';
PENKW : 'PEN';
STYLEKW : 'STYLE';
LINEWIDTHKW : 'LINEWIDTH';
READONLYKW : 'READONLY';
INSKW : 'INS';
UPRKW : 'UPR';
OVRKW : 'OVR';
CAPKW : 'CAP';
FILLKW : 'FILL';
WIZARDKW : 'WIZARD';
SPREADKW : 'SPREAD';
JOINKW : 'JOIN';
NOSHEETKW : 'NOSHEET';
UPKW : 'UP';
DOWNKW : 'DOWN';
ABOVEKW : 'ABOVE';
BELOWKW : 'BELOW';
FILTERKW : 'FILTER';
ORDERKW : 'ORDER';
PROJECTKW : 'PROJECT';
LTE : '<=';
GTE : '>=';
NEQ : '<>';
AMP_EQUAL : '&=';
DEEP_ASSIGN : ':=:';
STAR_EQUAL : '*=';
PLUS_EQUAL : '+=';
DIV_EQUAL : '/=';
SLICE_COLON : ':';
LT : '<';
GT : '>';
EQUAL : '=';
CARET : '^';
PLUS : '+';
MINUS : '-';
STAR : '*';
DIV : '/';
PERCENT : '%';
TILDE : '~';
AMP : '&';
DOT : '.';
LPAREN : '(' ;
RPAREN : ')' ;
LBRACE : '{' ;
RBRACE : '}' ;
LBRACKET : '[' ;
RBRACKET : ']' ;
COMMA : ',' ;
QUESTION : '?';
PIPE : '|';
INTLIT : [0-9]+ ;
REALLIT : [0-9]+ '.' [0-9]+ ;
// STRING literal with proper escaping
STRING
: '\'' (ESC | ~['\\])* '\''
;
fragment ESC
: '\\' .
;
PICTURE
: '@' ~[ \t\r\n,;(){}[\]]+
;
EOL
: [\r\n]+
;
NEWLINE
: ';'
;
ID
: ID_START ID_PART* ('#' | '$' | '"')?
;
fragment ID_START : [a-z_];
fragment ID_PART : [a-z0-9_:$];
LINE_CONTINUATION
: '|' [ \t]* [\r\n]+ -> skip
;
LINE_COMMENT
: '!' ~[\r\n]* -> skip
;
WS
: [ \t\f]+ -> skip
;


