From cf4a1ca9dec8c6c0e99da2f8ed2120ea80db2f6c Mon Sep 17 00:00:00 2001 From: d6 Date: Thu, 30 Sep 2021 23:58:50 -0400 Subject: [PATCH] add uxn/tal mode --HG-- branch : pmacs2 --- application.py | 4 +-- mode/tal.py | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+), 2 deletions(-) create mode 100644 mode/tal.py diff --git a/application.py b/application.py index 01a7918..827f609 100755 --- a/application.py +++ b/application.py @@ -1,4 +1,4 @@ -#!/usr/local/bin/python3 +#!/usr/bin/env python3 import curses from getpass import getpass @@ -179,7 +179,7 @@ class Application(object): 'awk', 'shell', 'shellmini', 'fstab', 'yacc', 'pipe', 'mbox', 'error', 'lua', 'lily', 'forth', 'ebnf', 'colortest', 'go', 'inform6', 'scala', 'markdown', 'roy', 'twine', 'idris', 'rust', - 'bosatsu', + 'bosatsu', 'tal', ) for name in names: exec("import mode.%s; mode.%s.install(self)" % (name, name)) diff --git a/mode/tal.py b/mode/tal.py new file mode 100644 index 0000000..a9bb148 --- /dev/null +++ b/mode/tal.py @@ -0,0 +1,79 @@ +from mode import Fundamental +from lex import Grammar, PatternRule, RegionRule + +class TalGrammar(Grammar): + rules = [ + PatternRule('spaces', '[ \t]+'), + RegionRule('comment', r'\(', Grammar, '\)'), + PatternRule('delimiter', r'[\[\]{}]'), + PatternRule('tal.inst', r'(BRK|LIT|INC|POP|DUP|NIP|SWP|OVR|ROT|EQU|NEQ|GTH|LTH|JMP|JCN|JSR|STH|LDZ|STZ|LDR|STR|LDA|STA|DEI|DEO|ADD|SUB|MUL|DIV|AND|ORA|EOR|SFT)2?k?r?'), # instructions + PatternRule('tal.defmacro', r'%[^ ]+'), # macro-define + PatternRule('tal.pad', r'\|[^ ]+'), # pad (absolute) + PatternRule('tal.pad', r'\$[^ ]+'), # pad (relative) + PatternRule('tal.deflabel', r'@[^ ]+'), # label-define + PatternRule('tal.defsublabel', r'&[^ ]+'), # sublabel-define + PatternRule('tal.spacer', r'/[^ ]+'), # sublabel-spacer + PatternRule('tal.hex', r'#[0-9a-fA-F]+'), # literal hex + PatternRule('tal.addr', r'\.[^/ ]+'), # little addr (zero page) + PatternRule('tal.addr', r',[^/ ]+'), # little addr (relative) + PatternRule('tal.addr', r';[^/ ]+'), # little addr (absolute) + PatternRule('tal.addr', r':[^/ ]+'), # raw addr + PatternRule('tal.addr', r'\'[^/ ]+'), # raw char + PatternRule('tal.addr', r'\"[^/ ]+'), # raw word + PatternRule('tal.word', r'[^ ]+'), + PatternRule('eol', '\n'), + ] + +# white is for delimiters, operators, numbers +default = ('default', 'default') + +# magenta is for keywords/builtins +lo_magenta = ('magenta202', 'default') +hi_magenta = ('magenta414', 'default') + +# red is for comments +lo_red = ('red300', 'default') +hi_red = ('red511', 'default') + +# orange is for macro definitions, headers and constants +hi_orange = ('yellow531', 'default') +lo_orange = ('yellow520', 'default') + +# yellow is for parts of macros +hi_yellow = ('yellow551', 'default') +lo_yellow = ('yellow330', 'default') + +# green is for strings and characters +lo_green = ('green030', 'default') +hi_green = ('green050', 'default') + +# cyan is for types +lo_cyan = ('cyan033', 'default') +hi_cyan = ('cyan155', 'default') + +# blue is definitions, functions and some macros +lo_blue = ('blue113', 'default') +hi_blue = ('blue225', 'default') + +class Tal(Fundamental): + name = 'tal' + extensions = ['.tal'] + grammar = TalGrammar + colors = { + 'tal.addr': hi_cyan, + 'tal.defmacro': hi_blue, + 'tal.addr': hi_yellow, + 'tal.inst': hi_magenta, + 'tal.deflabel': hi_blue, + 'tal.defsublabel': hi_cyan, + 'tal.hex': hi_green, + 'tal.pad': hi_orange, + 'tal.spacer': hi_orange, + } + _bindings = { + 'close-paren': (')',), + 'close-brace': ('}',), + 'close-bracket': (']',), + } + +install = Tal.install