summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--prolog/lexer.py1
-rw-r--r--prolog/parser.py44
2 files changed, 45 insertions, 0 deletions
diff --git a/prolog/lexer.py b/prolog/lexer.py
index 799ebb9..7ca67e1 100644
--- a/prolog/lexer.py
+++ b/prolog/lexer.py
@@ -53,6 +53,7 @@ operators = {
r'//': 'IDIV',
r'mod': 'MOD',
r'**': 'POW',
+ r'^': 'POW',
r'.': 'PERIOD',
r',': 'COMMA',
r';': 'SEMI'
diff --git a/prolog/parser.py b/prolog/parser.py
index 0c539d5..19d2da5 100644
--- a/prolog/parser.py
+++ b/prolog/parser.py
@@ -151,6 +151,10 @@ def p_term_simple(p):
| VARIABLE'''
p[0] = Tree('term', [make_token(p, 1)])
+def p_term_clpr(p):
+ 'term : LBRACE clpr RBRACE'
+ p[0] = Tree('term', [make_token(p, 1), p[2], make_token(p, 3)])
+
def p_args_single(p):
'args : term'
p[0] = Tree('args', [p[1]])
@@ -174,6 +178,46 @@ def p_functor(p):
'functor : NAME'
p[0] = Tree('functor', [make_token(p, 1)])
+# CLP(R) syntax
+def p_clpr_single(p):
+ 'clpr : clpr_constr'
+ p[0] = Tree('clpr', [p[1]])
+def p_clpr_more(p):
+ '''clpr : clpr_constr COMMA clpr
+ | clpr_constr SEMI clpr'''
+ p[0] = Tree('clpr', [p[1], make_token(p, 2), p[3]])
+
+def p_clpr_constr(p):
+ '''clpr_constr : clpr_expr LT clpr_expr
+ | clpr_expr GT clpr_expr
+ | clpr_expr LE clpr_expr
+ | clpr_expr GE clpr_expr
+ | clpr_expr NEQA clpr_expr
+ | clpr_expr EQA clpr_expr
+ | clpr_expr EQU clpr_expr'''
+ p[0] = Tree('clpr_constr', [p[1], make_token(p, 2), p[3]])
+
+def p_clpr_expr_value(p):
+ '''clpr_expr : VARIABLE
+ | UINTEGER
+ | UREAL'''
+ p[0] = Tree('clpr_expr', [make_token(p, 1)])
+def p_clpr_expr_unary(p):
+ '''clpr_expr : MINUS clpr_expr %prec UMINUS
+ | PLUS clpr_expr %prec UPLUS'''
+ p[0] = Tree('clpr_expr', [make_token(p, 1), p[2]])
+def p_clpr_expr_binary(p):
+ '''clpr_expr : clpr_expr PLUS clpr_expr
+ | clpr_expr MINUS clpr_expr
+ | clpr_expr STAR clpr_expr
+ | clpr_expr DIV clpr_expr
+ | clpr_expr POW clpr_expr
+ | clpr_expr NAME clpr_expr''' # XXX a hack to allow (X)*(X) without spaces
+ p[0] = Tree('clpr_expr', [p[1], make_token(p, 2), p[3]])
+def p_clpr_expr_parens(p):
+ 'clpr_expr : LPAREN clpr_expr RPAREN'
+ p[0] = Tree('clpr_expr', [make_token(p, 1), p[2], make_token(p, 3)])
+
def p_error(t):
if t is None:
raise SyntaxError('unexpected end of file')