summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimotej Lazar <timotej.lazar@fri.uni-lj.si>2016-05-15 18:31:42 +0200
committerTimotej Lazar <timotej.lazar@fri.uni-lj.si>2016-05-15 18:31:42 +0200
commit53f1b9251440b263d1605b86090e71cf09f6aad1 (patch)
tree51ed6398529b353679b9df7ed61f8ee05bf59fec
parent44f6a23f2ae75d9fb0d8de4f992267875a03a2a0 (diff)
Hack in support for DCGs in Prolog parser
-rw-r--r--prolog/lexer.py1
-rw-r--r--prolog/parser.py38
2 files changed, 7 insertions, 32 deletions
diff --git a/prolog/lexer.py b/prolog/lexer.py
index f905a2b..f2b19dc 100644
--- a/prolog/lexer.py
+++ b/prolog/lexer.py
@@ -27,6 +27,7 @@ import ply.lex as lex
# tokens; treat operators as names if followed by (
operators = {
r':-': 'FROM',
+ r'-->': 'FROMDCG',
r'->': 'IMPLIES',
r'\+': 'NOT',
r'not': 'NOT',
diff --git a/prolog/parser.py b/prolog/parser.py
index 4a3f4b5..8fe96da 100644
--- a/prolog/parser.py
+++ b/prolog/parser.py
@@ -21,7 +21,7 @@ from .util import Token
# PARSER
precedence = (
- ('nonassoc', 'FROM'),
+ ('nonassoc', 'FROM', 'FROMDCG'),
('right', 'IMPLIES'),
('right', 'NOT'),
('nonassoc', 'EQU', 'NEQU', 'EQ', 'NEQ', 'UNIV', 'IS', 'EQA', 'NEQA', 'LT', 'LE', 'GT', 'GE', 'LTL', 'LEL', 'GTL', 'GEL', 'IN', 'INS', 'THROUGH', 'EQFD', 'NEQFD', 'LTFD', 'LEFD', 'GTFD', 'GEFD'),
@@ -51,7 +51,8 @@ def p_clause_head(p):
'clause : head PERIOD'
p[0] = Tree('clause', [p[1], make_token(p, 2)])
def p_clause_rule(p):
- 'clause : head FROM or PERIOD'
+ '''clause : head FROM or PERIOD
+ | head FROMDCG or PERIOD'''
p[0] = Tree('clause', [p[1], make_token(p, 2), p[3], make_token(p, 4)])
def p_head(p):
@@ -198,37 +199,10 @@ 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]])
-
+# XXX temporary until the new parser is in place, this also covers { } notation for DCGs
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)])
+ 'clpr_constr : term'
+ p[0] = p[1]
def p_error(t):
if t is None: