# frozen_string_literal: true # Simple DSL implementation for Ripper code generation # # input: /*% ripper: stmts_add!(stmts_new!, void_stmt!) %*/ # output: # VALUE v1, v2; # v1 = dispatch0(stmts_new); # v2 = dispatch0(void_stmt); # $$ = dispatch2(stmts_add, v1, v2); # # - The code must be a single line. # # - The code is basically Ruby code, even if it appears like in C and # the result will be processed as C. e.g., comments need to be in # Ruby style. class DSL TAG_PATTERN = /(?><[a-zA-Z0-9_]+>)/.source NAME_PATTERN = /(?>\$|\d+|[a-zA-Z_][a-zA-Z0-9_]*|\[[a-zA-Z_.][-a-zA-Z0-9_.]*\])(?>(?:\.|->)[a-zA-Z_][a-zA-Z0-9_]*)*/.source NOT_REF_PATTERN = /(?>\#.*|[^\"$@]*|"(?>\\.|[^\"])*")/.source def self.line?(line, lineno = nil, indent: nil) if %r<(?\s*)/\*% *ripper(?:\[(?