summaryrefslogtreecommitdiff
path: root/prolog/lexer.py
diff options
context:
space:
mode:
Diffstat (limited to 'prolog/lexer.py')
-rw-r--r--prolog/lexer.py88
1 files changed, 52 insertions, 36 deletions
diff --git a/prolog/lexer.py b/prolog/lexer.py
index 4e6c746..32a25fc 100644
--- a/prolog/lexer.py
+++ b/prolog/lexer.py
@@ -19,52 +19,65 @@
import ply.lex as lex
operators = {
- r':-': 'FROM',
- r'-->': 'FROMDCG',
- r'->': 'IMPLIES',
- r'\+': 'NOT',
- r'=': 'EQU',
- r'\=': 'NEQU',
- r'==': 'EQ',
+ r':-': 'FROM',
+ r'-->': 'FROMDCG',
+ r',': 'COMMA',
+ r';': 'SEMI',
+ r'->': 'IMPLIES',
+ r'*->': 'SOFTCUT',
+ r'\+': 'NOT',
+ r'=': 'EQU',
+ r'\=': 'NEQU',
+ r'=@=': 'EQV',
+ r'\=@=': 'NEQV',
+ r'==': 'EQ',
r'\==': 'NEQ',
r'=..': 'UNIV',
- r'is': 'IS',
+ r'is': 'IS',
r'=:=': 'EQA',
r'=\=': 'NEQA',
- r'<': 'LT',
- r'=<': 'LE',
- r'>': 'GT',
- r'>=': 'GE',
- r'@<': 'LTL',
+ r'<': 'LT',
+ r'=<': 'LE',
+ r'>': 'GT',
+ r'>=': 'GE',
+ r'@<': 'LTL',
r'@=<': 'LEL',
- r'@>': 'GTL',
+ r'@>': 'GTL',
r'@>=': 'GEL',
- r'#=': 'EQFD',
- r'#\=': 'NEQFD',
- r'#<': 'LTFD',
- r'#=<': 'LEFD',
- r'#>': 'GTFD',
- r'#>=': 'GEFD',
- r'in': 'IN',
- r'ins': 'INS',
- r'..': 'THROUGH',
- r'+': 'PLUS',
- r'-': 'MINUS',
- r'*': 'STAR',
- r'/': 'DIV',
- r'//': 'IDIV',
+ r'+': 'PLUS',
+ r'-': 'MINUS',
+ r'*': 'STAR',
+ r'/': 'SLASH',
+ r'//': 'SLASH2',
+ r'<<': 'SHIFTLEFT',
+ r'>>': 'SHIFTRIGHT',
+ r'div': 'DIV',
r'mod': 'MOD',
- r'**': 'POW',
- r'^': 'POW',
- r'.': 'PERIOD',
- r',': 'COMMA',
- r';': 'SEMI'
+ r'rdiv': 'RDIV',
+ r'rem': 'REM',
+ r'xor': 'XOR',
+ r'^': 'POW',
+ r'**': 'POWSTAR',
+ '/\\': 'AND',
+ '\\': 'NEG',
+
+ # CLP(FD)
+ r'in': 'IN',
+ r'ins': 'INS',
+ r'..': 'THROUGH',
+ r'#=': 'FDEQ',
+ r'#\=': 'FDNEQ',
+ r'#<': 'FDLT',
+ r'#=<': 'FDLE',
+ r'#>': 'FDGT',
+ r'#>=': 'FDGE',
+ r'\/': 'FDUNION',
}
tokens = sorted(list(operators.values())) + [
'UINTEGER', 'UREAL',
'NAME', 'VARIABLE', 'STRING',
'LBRACKET', 'RBRACKET', 'LPAREN', 'RPAREN', 'PIPE', 'LBRACE', 'RBRACE',
- 'INVALID'
+ 'PERIOD', 'INVALID'
]
# punctuation
@@ -88,8 +101,11 @@ def t_comment(t):
def t_NAME(t):
r"'(''|\\.|[^\\'])*'|[a-z][a-zA-Z0-9_]*|[-+*/\\^<>=~:.?@#$&]+|!|;|,"
- # return appropriate tokens for names that are operators
- t.type = operators.get(t.value, 'NAME')
+ if t.value == '.':
+ t.type = 'PERIOD'
+ else:
+ # return appropriate tokens for names that are operators
+ t.type = operators.get(t.value, 'NAME')
return t
t_ignore = ' \t'