module TracePreprocessor::CodeGenerator

Public Class Methods

converter_functions_c_code(dsl) click to toggle source
# File lib/trace_preprocessor/code_generator.rb, line 29
def self.converter_functions_c_code dsl
  result = output_token_code dsl

  dsl.lexemes.each do |name, lexeme|
    if lexeme.converter[:c]
      result += parse_lexeme_code(name, lexeme)
    end
  end

  result      
end
generate_lex(dsl) click to toggle source
# File lib/trace_preprocessor/code_generator.rb, line 4
    def self.generate_lex dsl
      template = 
<<-LEX
%{
COMMON_CODE

CONVERTER_FUNCTIONS  
%}    

%option nounput

%%

REGEXPS

%%
LEX
    
      template.gsub!("COMMON_CODE",         dsl.code)
      template.gsub!("CONVERTER_FUNCTIONS", converter_functions_c_code(dsl))
      template.gsub!("REGEXPS",             regexps(dsl))
    
      template
    end
output_token_code(dsl) click to toggle source
# File lib/trace_preprocessor/code_generator.rb, line 56
    def self.output_token_code dsl
<<-CODE
void output_token(const char* name, const char* source, long value, int value_kind) {
    #{dsl.output_token_code}
}
  
CODE
    end
parse_lexeme_code(name, lexeme) click to toggle source
# File lib/trace_preprocessor/code_generator.rb, line 65
    def self.parse_lexeme_code(name, lexeme)
<<-CODE
long converter_#{name}() {
    #{lexeme.converter[:c]}
}

void parse_#{name}() {
    output_token("#{name}", yytext, converter_#{name}(), #{lexeme.value_kind == :exact ? 1 : 0});
}

CODE
    end
regexps(dsl) click to toggle source
# File lib/trace_preprocessor/code_generator.rb, line 41
def self.regexps dsl
  result = ""

  a = dsl.lexemes.values
  a.sort! { |x, y| x.priority <=> y.priority }

  a.each do |lexeme|
    if lexeme.regexp
      result += "#{lexeme.regexp.source} parse_#{lexeme.name}();\n"
    end
  end
  
  result
end