Skip to main content

Language Library

Grammar of SaviScript

Used as a reference page for other pages' contents. Copied from SaviScript.g4:

prog
: (NEWLINE | statment)* EOF
| (NEWLINE | statment)+
;

statment
: onEvent
| command
| uses
;

command
: LOAD_FLOOR args
| LOAD_MAP args
| DISPLAY_CONFIRM argykwargy
| SLEEP args
| GOTO args
| PLAY_SOUND args
| STOP_SOUND argykwargy?
| DOCK
| DOCK_TO args
| UNDOCK
| DISPLAY_CHOICE argykwargy
| DISPLAY args
| SET_LED_MODE args
| OPEN_LID
| CLOSE_LID
| PUSH_BUTTON argykwargy?
| SHIMMY
| DETECT_DOOR argykwargy?
| RUN argykwargy
| NOTIFY args
| PROMPT_KEYCODE_ACCESS argykwargy?
| TRIGGER args (WITH argykwargy)?
| WAIT_FOR args
| START_BAG_RECORDING args
| STOP_BAG_RECORDING
| PROMPT_KEYPAD argykwargy
| ROTATE args
| BIND_JOYSTICK argykwargy
| DETECT_PEOPLE argykwargy?
| STOP_PEOPLE_DETECTION
| END_PROGRAM
| START_MAPPING argykwargy?
| STOP_MAPPING
| CLEAN_AREA argykwargy?
| DISPLAY_CLEANING_CHOICE argykwargy?
| AUDIT argykwargy
| TURN_ON_VACUUM
| TURN_OFF_VACUUM
| TURN_ON_BRUSH
| TURN_OFF_BRUSH
| CLEAR_LOCKOUTS
| LOAD_DRAWER argykwargy?
| UNLOAD_DRAWER argykwargy?
| OPEN_DRAWER argykwargy?
| CLOSE_DRAWER argykwargy?
| QUEUE_PROGRAM argykwargy
| CANCEL_ALL
| SET_PLACE argykwargy?
| SET_DOCK argykwargy?
;

onEvent
: ON arg AS ID '{' prog '}'
| ON arg AS ID WHERE test '{' prog '}'
| ON arg '{' prog '}'
;

uses
: USES SAVI_CHANNEL arg AS variable
| USES PARAMS argykwargy
;

obj
: '{' (NEWLINE | keyValue)* NEWLINE? '}'
;

keyValue
: arg ':' arg
;

argykwargy
: args ',' kwargs
| kwargs
| args
;

kwargs
: kwarg (',' kwarg)*
;

kwarg
: variable ':' arg
| STRING ':' arg
| INT ':' arg
;

args
: arg (',' arg)*
;

arg
: variable #saviVariable
| obj #saviObject
| listObj #saviList
| INT #saviInt
| FLOAT #saviFloat
| STRING #saviString
| TRUE #saviTrue
| FALSE #saviFalse
;

listObj
: '[' args? ']'
;

variable
: idDot WHERE test #saviIdDotWhere
| idDot #saviIdDot
| ID WHERE test #saviIdWhere
| ID #saviId
;

idDot
: ID ('.' ID)+
;

test
: andTest ( OR andTest)*
;

andTest
: notTest ( AND notTest)*
;

notTest
: NOT notTest
| simpleCompare
;

simpleCompare
: variable compOp arg
;

compOp: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in';

// Commands
LOAD_FLOOR: 'LOAD_FLOOR';
LOAD_MAP: 'LOAD_MAP';
DISPLAY_CONFIRM: 'DISPLAY_CONFIRM';
SLEEP: 'SLEEP';
GOTO: 'GOTO';
PLAY_SOUND: 'PLAY_SOUND';
STOP_SOUND: 'STOP_SOUND';
DOCK_TO: 'DOCK_TO';
DOCK: 'DOCK';
UNDOCK: 'UNDOCK';
DISPLAY_CHOICE: 'DISPLAY_CHOICE';
DISPLAY: 'DISPLAY';
SET_LED_MODE: 'SET_LED_MODE';
OPEN_LID: 'OPEN_LID';
CLOSE_LID: 'CLOSE_LID';
PUSH_BUTTON: 'PUSH_BUTTON';
SHIMMY: 'SHIMMY';
DETECT_DOOR: 'DETECT_DOOR';
RUN: 'RUN';
NOTIFY: 'NOTIFY';
PROMPT_KEYCODE_ACCESS: 'PROMPT_KEYCODE_ACCESS';
TRIGGER: 'TRIGGER';
WAIT_FOR: 'WAIT_FOR';
START_BAG_RECORDING: 'START_BAG_RECORDING';
STOP_BAG_RECORDING: 'STOP_BAG_RECORDING';
ROTATE: 'ROTATE';
PROMPT_KEYPAD: 'PROMPT_KEYPAD';
BIND_JOYSTICK: 'BIND_JOYSTICK';
DETECT_PEOPLE: 'DETECT_PEOPLE';
STOP_PEOPLE_DETECTION: 'STOP_PEOPLE_DETECTION';
END_PROGRAM: 'END_PROGRAM';
START_MAPPING: 'START_MAPPING';
STOP_MAPPING: 'STOP_MAPPING';
CLEAN_AREA: 'CLEAN_AREA';
DISPLAY_CLEANING_CHOICE: 'DISPLAY_CLEANING_CHOICE';
AUDIT: 'AUDIT';
TURN_ON_VACUUM: 'TURN_ON_VACUUM';
TURN_OFF_VACUUM: 'TURN_OFF_VACUUM';
TURN_ON_BRUSH: 'TURN_ON_BRUSH';
TURN_OFF_BRUSH: 'TURN_OFF_BRUSH';
CLEAR_LOCKOUTS: 'CLEAR_LOCKOUTS';
LOAD_DRAWER: 'LOAD_DRAWER';
UNLOAD_DRAWER: 'UNLOAD_DRAWER';
OPEN_DRAWER: 'OPEN_DRAWER';
CLOSE_DRAWER: 'CLOSE_DRAWER';
QUEUE_PROGRAM: 'QUEUE_PROGRAM';
CANCEL_ALL: 'CANCEL_ALL';
SET_PLACE: 'SET_PLACE';
SET_DOCK: 'SET_DOCK';

// Keywords
USES: 'USES';
SAVI_CHANNEL: 'SAVI_CHANNEL';
PARAMS: 'PARAMS';
WITH: 'WITH';
WHERE: 'WHERE';
ON: 'ON';
AS: 'AS';
AND: 'AND';
OR: 'OR';
NOT: 'NOT';

// Primitives
TRUE: 'True';
FALSE: 'False';
ID : [a-zA-Z]{1}[a-zA-Z0-9_]* ;
//CAP_ID : [A-Z]{1}[A-Z0-9_]* ;
INT: '-'? [0-9]+ ;
STRING : '"' ('""'|~'"')* '"' ;
FLOAT
: '-'? DIGIT+ '.' DIGIT*
| '-'? '.' DIGIT+
;

NEWLINE
: ( '\r'? '\n' ) ;

fragment DIGIT
: [0-9]
;

fragment SPACES
: [ \t]+
;

COMMENT : '#' .*? NEWLINE -> skip ;
WS : [ \t]+ -> skip ;