import time from mode import Fundamental from lex import Grammar, PatternRule, RegionRule, NocasePatternRule, NocaseRegionRule from mode.python import StringGrammar2 from method.shell import Interact class DataGrammar(Grammar): rules = [PatternRule(r'data', r'[^)]+')] class StringGrammar1(Grammar): rules = [PatternRule(r'data', r'[^\']+')] class StringGrammar3(Grammar): rules = [PatternRule(r'data', r'[^)]+')] class ForthGrammar(Grammar): rules = [ PatternRule(r'comment', r"\\(?: .*)?\n$"), RegionRule(r'comment', r'\((?= |\n)', DataGrammar, r'\)'), NocaseRegionRule(r'comment', r'0 \[if\]', DataGrammar, r'\[(?:endif|then)\]'), PatternRule(r'delimiter', r"[:;\[\]]"), RegionRule(r'string', r'[.cs]" ', StringGrammar1, r'"'), RegionRule(r'string', r'[.s]\\" ', StringGrammar2, r'"'), RegionRule(r'string', r'\.\( ', StringGrammar3, r'\)'), PatternRule(r'operator', r'(?:mod|m\*|f\+|f-|f\*|f/|\+|-|\*/mod|\*/|\*|/mod|/)(?=[ \n$])'), NocasePatternRule(r'keyword', r'(?:variable|value|until|tuck|truth|to|then|test|swap|step|see|rot|roll|recurse|r>|pick|over|mod|m\*|loop|locals|invert|if|hex|here|fsort|fln|fexp|f!|f@|f\+|f-|f\*|f/|execute|endif|else|dup|drop|does>|do|decimal|d!|d@|create|constant|cells|cell|c!|c@|bye|begin|allot|\[(?:if|then|endif)\]|>r|!|@|\+loop|\+|-|\*/mod|\*/|\*|/mod|/)(?=[ \n$])'), PatternRule(r'forth_def', r'(?<=:) +[^ ]+'), NocasePatternRule(r'number', r"'[a-z]"), NocasePatternRule(r'number', r'%?-?[0-1]+\.?'), NocasePatternRule(r'number', r'[&#]?-?[0-9]+\.?'), NocasePatternRule(r'number', r"(?:0x|\$)[0-9a-f]+\.?"), NocasePatternRule(r'number', r'[+-]?[0-9]+\.?e?[+-][0-9]+'), PatternRule(r'forth_word', r'[^ ]+'), PatternRule(r'spaces', r' +'), PatternRule(r'eol', r'\n'), ] class GforthStart(Interact): args = [] def _execute(self, w, **vargs): Interact._execute(self, w, bname='*GForth*', cmd='gforth') class GforthLoadFile(Interact): args = [] def _execute(self, w, **vargs): Interact._execute(self, w, bname='*GForth*', cmd='gforth') b = w.application.get_buffer_by_name('*GForth*') time.sleep(0.1) for line in w.buffer.lines: b.pipe_write(line + '\n') class Forth(Fundamental): modename = 'FORTH' extensions = ['.fs', '.fi', '.fb'] grammar = ForthGrammar commentc = '\\' colors = { 'forth_def': ('blue', 'default', 'bold'), 'forth_word': ('yellow', 'default', 'bold'), } actions = [GforthStart, GforthLoadFile] install = Forth.install