mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	add Slash to linguist
This commit is contained in:
		| @@ -1204,6 +1204,11 @@ Shell: | ||||
|   extensions: | ||||
|   - .tmux | ||||
|  | ||||
| Slash: | ||||
|   type: programming | ||||
|   color: "#007eff" | ||||
|   primary_extension: .sl | ||||
|  | ||||
| Smalltalk: | ||||
|   type: programming | ||||
|   color: "#596706" | ||||
|   | ||||
							
								
								
									
										127
									
								
								samples/Slash/brainfuck.sl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										127
									
								
								samples/Slash/brainfuck.sl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,127 @@ | ||||
| <% | ||||
|  | ||||
| class Env { | ||||
|     def init { | ||||
|         @memory = []; | ||||
|         @ptr = 0; | ||||
|     } | ||||
|  | ||||
|     def ptr       { @ptr } | ||||
|     def ptr=(ptr) { @ptr = ptr } | ||||
|  | ||||
|     def current_value         { @memory[@ptr] || 0 } | ||||
|     def current_value=(value) { @memory[@ptr] = value } | ||||
| } | ||||
|  | ||||
| class AST { | ||||
|     class Next { | ||||
|         def eval(env) { | ||||
|             env.ptr++; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     class Prev { | ||||
|         def eval(env) { | ||||
|             env.ptr--; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     class Inc { | ||||
|         def eval(env) { | ||||
|             env.current_value++; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     class Dec { | ||||
|         def eval(env) { | ||||
|             env.current_value--; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     class Output { | ||||
|         def eval(env) { | ||||
|             print(env.current_value.char); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     class Input { | ||||
|         def eval(env) { | ||||
|             ... | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     class Sequence { | ||||
|         def init(nodes) { | ||||
|             @nodes = nodes; | ||||
|         } | ||||
|  | ||||
|         def eval(env) { | ||||
|             for node in @nodes { | ||||
|                 node.eval(env); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     class Loop { | ||||
|         def init(seq) { | ||||
|             @seq = seq; | ||||
|         } | ||||
|  | ||||
|         def eval(env) { | ||||
|             while env.current_value != 0 { | ||||
|                 @seq.eval(env); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| class Parser { | ||||
|     def init(str) { | ||||
|         @chars = str.split(""); | ||||
|     } | ||||
|  | ||||
|     def parse { | ||||
|         @stack = [[]]; | ||||
|         for char in @chars { | ||||
|             _parse_char(char); | ||||
|         } | ||||
|         if @stack.length != 1 { | ||||
|             throw SyntaxError.new("unexpected end of input"); | ||||
|         } | ||||
|         AST::Sequence.new(@stack.last); | ||||
|     } | ||||
|  | ||||
|     def _parse_char(char) { | ||||
|         switch char { | ||||
|             ">" { _add(AST::Next.new); } | ||||
|             "<" { _add(AST::Prev.new); } | ||||
|             "+" { _add(AST::Inc.new); } | ||||
|             "-" { _add(AST::Dec.new); } | ||||
|             "." { _add(AST::Output.new); } | ||||
|             "," { _add(AST::Input.new); } | ||||
|             "[" { _open_loop(); } | ||||
|             "]" { _close_loop(); } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     def _add(node) { | ||||
|         @stack.last.push(node); | ||||
|     } | ||||
|  | ||||
|     def _open_loop { | ||||
|         @stack.push([]); | ||||
|     } | ||||
|  | ||||
|     def _close_loop { | ||||
|         if @stack.length == 1 { | ||||
|             throw SyntaxError.new("unexpected ']'"); | ||||
|         } | ||||
|  | ||||
|         nodes = @stack.pop; | ||||
|         _add(AST::Loop.new(AST::Sequence.new(nodes))); | ||||
|     } | ||||
| } | ||||
|  | ||||
| src = File.read(ARGV.first); | ||||
| ast = Parser.new(src).parse; | ||||
| ast.eval(Env.new); | ||||
		Reference in New Issue
	
	Block a user