172 lines
2.9 KiB
Plaintext
172 lines
2.9 KiB
Plaintext
grammar Congress;
|
|
|
|
options {
|
|
language=Python;
|
|
output=AST;
|
|
ASTLabelType=CommonTree;
|
|
}
|
|
|
|
tokens {
|
|
PROG;
|
|
COMMA=',';
|
|
COLONMINUS=':-';
|
|
LPAREN='(';
|
|
RPAREN=')';
|
|
// Structure
|
|
THEORY;
|
|
STRUCTURED_NAME;
|
|
|
|
// Kinds of Formulas
|
|
RULE;
|
|
LITERAL;
|
|
ATOM;
|
|
NOT;
|
|
|
|
// Terms
|
|
VARIABLE;
|
|
STRING_OBJ;
|
|
INTEGER_OBJ;
|
|
FLOAT_OBJ;
|
|
SYMBOL_OBJ;
|
|
}
|
|
|
|
prog
|
|
: formula formula* EOF -> ^(THEORY formula+)
|
|
| EOF
|
|
;
|
|
|
|
formula
|
|
: bare_formula formula_terminator? -> bare_formula
|
|
;
|
|
|
|
formula_terminator
|
|
: ';'
|
|
| '.'
|
|
;
|
|
|
|
bare_formula
|
|
: rule
|
|
| atom
|
|
;
|
|
|
|
rule
|
|
: atom COLONMINUS literal_list -> ^(RULE atom literal_list)
|
|
;
|
|
|
|
literal_list
|
|
: literal (COMMA literal)* -> literal+
|
|
;
|
|
|
|
literal
|
|
: atom -> atom
|
|
| NEGATION atom -> ^(NOT atom)
|
|
;
|
|
|
|
NEGATION
|
|
: 'not'
|
|
| 'NOT'
|
|
| '!'
|
|
;
|
|
|
|
atom
|
|
: relation_constant (LPAREN term_list? RPAREN)? -> ^(ATOM relation_constant term_list?)
|
|
;
|
|
|
|
term_list
|
|
: term (COMMA term)* -> term+
|
|
;
|
|
|
|
term
|
|
: object_constant
|
|
| variable
|
|
;
|
|
|
|
object_constant
|
|
: INT -> ^(INTEGER_OBJ INT)
|
|
| FLOAT -> ^(FLOAT_OBJ FLOAT)
|
|
| STRING -> ^(STRING_OBJ STRING)
|
|
;
|
|
|
|
variable
|
|
: ID -> ^(VARIABLE ID)
|
|
;
|
|
|
|
relation_constant
|
|
: ID (':' ID)* SIGN? -> ^(STRUCTURED_NAME ID+ SIGN?)
|
|
;
|
|
|
|
SIGN
|
|
: '+' | '-'
|
|
;
|
|
|
|
ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
|
|
;
|
|
|
|
INT : '0'..'9'+
|
|
;
|
|
|
|
FLOAT
|
|
: ('0'..'9')+ '.' ('0'..'9')* EXPONENT?
|
|
| '.' ('0'..'9')+ EXPONENT?
|
|
| ('0'..'9')+ EXPONENT
|
|
;
|
|
|
|
COMMENT
|
|
: '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}
|
|
| '/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;}
|
|
;
|
|
|
|
WS : ( ' '
|
|
| '\t'
|
|
| '\r'
|
|
| '\n'
|
|
) {$channel=HIDDEN;}
|
|
;
|
|
|
|
// Characters in string are either
|
|
// (i) any character except ", carriage-return, linefeed, backslash
|
|
// (ii) an escape sequence like \t, \n, \r
|
|
// (iii) or a universal character name like \u10af
|
|
// Order of the above 3 in the following rule is important.
|
|
STRING
|
|
: '"' (~('"' | '\r' | '\n' | '\\')
|
|
| ESC_SEQ )*
|
|
'"'
|
|
;
|
|
|
|
// Escape sequences
|
|
// Simple escape sequences like \n, \t, \\ are taken from Stroustrup.
|
|
// Octal escape sequences are either 1, 2, or 3 octal digits exactly.
|
|
// Hexadecimal escape sequences begin with \x and continue until non-hex found.
|
|
// No handling of tri-graph sequences.
|
|
|
|
|
|
|
|
CHAR: '\'' ( ESC_SEQ | ~('\''|'\\') ) '\''
|
|
;
|
|
|
|
fragment
|
|
EXPONENT : ('e'|'E') ('+'|'-')? ('0'..'9')+ ;
|
|
|
|
fragment
|
|
HEX_DIGIT : ('0'..'9'|'a'..'f'|'A'..'F') ;
|
|
|
|
fragment
|
|
ESC_SEQ
|
|
: '\\' ('b'|'t'|'n'|'f'|'r'|'"'|'\''|'\\')
|
|
| UNICODE_ESC
|
|
| OCTAL_ESC
|
|
;
|
|
|
|
fragment
|
|
OCTAL_ESC
|
|
: '\\' ('0'..'3') ('0'..'7') ('0'..'7')
|
|
| '\\' ('0'..'7') ('0'..'7')
|
|
| '\\' ('0'..'7')
|
|
;
|
|
|
|
fragment
|
|
UNICODE_ESC
|
|
: '\\' 'u' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT
|
|
;
|