diff options
Diffstat (limited to 'prolog/lexer.py')
-rw-r--r-- | prolog/lexer.py | 88 |
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' |