From 02f737bdd6ec644f91c8a1f52576321949c0aea6 Mon Sep 17 00:00:00 2001 From: Sunil Shetye Date: Thu, 5 Jul 2018 17:32:05 +0530 Subject: get function type also from lexer --- sci2jslex.py | 52 +++++++++++++++++++++++----------------------------- sci2jsyacc.py | 40 ++++++++++++++++++++-------------------- 2 files changed, 43 insertions(+), 49 deletions(-) diff --git a/sci2jslex.py b/sci2jslex.py index 249775bd..84619f90 100755 --- a/sci2jslex.py +++ b/sci2jslex.py @@ -59,7 +59,12 @@ PREDEFINED_VARIABLES = { 't': 'PREVAR_BOOLEAN', } -FUNCTION_NAMES = { +BOOLEAN_TYPE = 'boolean' +BOOLEAN_FUNCTION_NAMES = { +} + +DOUBLE_TYPE = 'double' +DOUBLE_FUNCTION_NAMES = { '_', 'ANDLOG_f', 'AutoScale', @@ -227,27 +232,35 @@ FUNCTION_NAMES = { 'zeros', } -BOOLEAN_FUNCTION_NAMES = { -} - -DOUBLE_FUNCTION_NAMES = { -} - +MATRIX_TYPE = 'matrix' MATRIX_FUNCTION_NAMES = { } +NULL_TYPE = 'null' NULL_FUNCTION_NAMES = { } +OBJECT_TYPE = 'object' OBJECT_FUNCTION_NAMES = { } +STRING_TYPE = 'string' STRING_FUNCTION_NAMES = { } +VECTOR_TYPE = 'vector' VECTOR_FUNCTION_NAMES = { } +FUNCTION_NAMES = { } +FUNCTION_NAMES.update(dict.fromkeys(BOOLEAN_FUNCTION_NAMES, BOOLEAN_TYPE)) +FUNCTION_NAMES.update(dict.fromkeys(DOUBLE_FUNCTION_NAMES, DOUBLE_TYPE)) +FUNCTION_NAMES.update(dict.fromkeys(MATRIX_FUNCTION_NAMES, MATRIX_TYPE)) +FUNCTION_NAMES.update(dict.fromkeys(NULL_FUNCTION_NAMES, NULL_TYPE)) +FUNCTION_NAMES.update(dict.fromkeys(OBJECT_FUNCTION_NAMES, OBJECT_TYPE)) +FUNCTION_NAMES.update(dict.fromkeys(STRING_FUNCTION_NAMES, STRING_TYPE)) +FUNCTION_NAMES.update(dict.fromkeys(VECTOR_FUNCTION_NAMES, VECTOR_TYPE)) + OBJECTS = { # 'PREVAR_scicos_context': 'PREVAR_SCICOS_CONTEXT', # 'arg1': 'ARG1', @@ -267,7 +280,6 @@ JOBTYPES = { tokens = [ 'ADDITION', 'ASSIGNMENT', - 'BOOLEAN_FUNCTIONNAME', 'CLOSEBRACKET', 'CLOSEOPENBRACKET', 'CLOSESQBRACKET', @@ -275,28 +287,22 @@ tokens = [ 'COMMA', 'COMPARISON', 'DOT', - 'DOUBLE_FUNCTIONNAME', 'DQSTRING', 'EOL', 'FUNCTIONNAME', 'LASTINDEX', 'LOGICAL', - 'MATRIX_FUNCTIONNAME', 'MULTIPLICATION', 'NOT', - 'NULL_FUNCTIONNAME', 'NUMBER', - 'OBJECT_FUNCTIONNAME', 'OPENBRACKET', 'OPENSQBRACKET', 'PREVAR', 'QSTRING', 'SEMICOLON', 'SPACE', - 'STRING_FUNCTIONNAME', 'TRANSPOSE', 'VAR', - 'VECTOR_FUNCTIONNAME', ] + list(SYNTAX_TOKENS.values()) + list(set(PREDEFINED_VARIABLES.values())) + list(OBJECTS.values()) + list(JOBTYPES.values()) states = ( @@ -372,22 +378,10 @@ def t_VAR(t): if vartype is None: vartype = OBJECTS.get(t.value) if vartype is None: - if t.value in BOOLEAN_FUNCTION_NAMES: - vartype = 'BOOLEAN_FUNCTIONNAME' - elif t.value in DOUBLE_FUNCTION_NAMES: - vartype = 'DOUBLE_FUNCTIONNAME' - elif t.value in MATRIX_FUNCTION_NAMES: - vartype = 'MATRIX_FUNCTIONNAME' - elif t.value in NULL_FUNCTION_NAMES: - vartype = 'NULL_FUNCTIONNAME' - elif t.value in OBJECT_FUNCTION_NAMES: - vartype = 'OBJECT_FUNCTIONNAME' - elif t.value in STRING_FUNCTION_NAMES: - vartype = 'STRING_FUNCTIONNAME' - elif t.value in VECTOR_FUNCTION_NAMES: - vartype = 'VECTOR_FUNCTIONNAME' - elif t.value in FUNCTION_NAMES: + if t.value in FUNCTION_NAMES: vartype = 'FUNCTIONNAME' + functiontype = FUNCTION_NAMES[t.value] + t.value = (t.value, functiontype) else: vartype = 'VAR' t.lexer.afterarray = vartype == 'VAR' diff --git a/sci2jsyacc.py b/sci2jsyacc.py index ce76535f..3606b784 100755 --- a/sci2jsyacc.py +++ b/sci2jsyacc.py @@ -15,7 +15,7 @@ import sys import pickle import ply.yacc as yacc -from sci2jslex import tokens, JOBTYPES +from sci2jslex import tokens, JOBTYPES, BOOLEAN_TYPE, DOUBLE_TYPE, MATRIX_TYPE, NULL_TYPE, OBJECT_TYPE, STRING_TYPE, VECTOR_TYPE precedence = ( ('left', 'COLON'), @@ -29,14 +29,6 @@ precedence = ( ('left', 'DOT'), ) -BOOLEAN_TYPE = 'boolean' -DOUBLE_TYPE = 'double' -MATRIX_TYPE = 'matrix' -NULL_TYPE = 'null' -OBJECT_TYPE = 'object' -STRING_TYPE = 'string' -VECTOR_TYPE = 'vector' - PARSE_MAP = { BOOLEAN_TYPE: 'parseBoolean', DOUBLE_TYPE: 'parseFloat', @@ -114,16 +106,24 @@ def p_functionblock_functionstatement_statementblock_endfunction(p): 'functionblock : functionstatement statementblock ENDFUNCTION EOL' p[0] = '' -def p_jobfunctionstatement_function(p): - '''jobfunctionstatement : FUNCTION lterm ASSIGNMENT VAR OPENBRACKET JOB COMMA VAR COMMA VAR CLOSEBRACKET EOL - | FUNCTION lterm ASSIGNMENT FUNCTIONNAME OPENBRACKET JOB COMMA VAR COMMA VAR CLOSEBRACKET EOL''' +def p_jobfunctionstatement_function_var(p): + 'jobfunctionstatement : FUNCTION lterm ASSIGNMENT VAR OPENBRACKET JOB COMMA VAR COMMA VAR CLOSEBRACKET EOL' for var in (p[6], p[8], p[10]): FUNCTION_VARS.add(var) p[0] = '%s' % (p[4]) -def p_functionstatement_function(p): - '''functionstatement : FUNCTION lterm ASSIGNMENT VAR OPENBRACKET list CLOSEBRACKET EOL - | FUNCTION lterm ASSIGNMENT FUNCTIONNAME OPENBRACKET list CLOSEBRACKET EOL''' +def p_jobfunctionstatement_function_functionname(p): + 'jobfunctionstatement : FUNCTION lterm ASSIGNMENT FUNCTIONNAME OPENBRACKET JOB COMMA VAR COMMA VAR CLOSEBRACKET EOL' + for var in (p[6], p[8], p[10]): + FUNCTION_VARS.add(var) + p[0] = '%s' % (p[4][0]) + +def p_functionstatement_function_var(p): + 'functionstatement : FUNCTION lterm ASSIGNMENT VAR OPENBRACKET list CLOSEBRACKET EOL' + p[0] = '' + +def p_functionstatement_function_functionname(p): + 'functionstatement : FUNCTION lterm ASSIGNMENT FUNCTIONNAME OPENBRACKET list CLOSEBRACKET EOL' p[0] = '' # end define functionblock @@ -559,7 +559,7 @@ def p_getvaluearg2arraylistitem_string_string(p): def p_getvaluearg2arraylistitem_functionname_parameters(p): 'getvaluearg2arraylistitem : FUNCTIONNAME OPENBRACKET list CLOSEBRACKET' - p[0] = '%s(%s)' % (p[1], p[3][0]) + p[0] = '%s(%s)' % (p[1][0], p[3][0]) LABELS.append(p[0]) def p_getvaluearg3_list(p): @@ -745,12 +745,12 @@ def p_expression_term(p): # A(2,3) def p_function_function_parameters(p): 'function : FUNCTIONNAME OPENBRACKET list CLOSEBRACKET' - p[0] = '%*s%s(%s)' % (INDENT_LEVEL * INDENT_SIZE, ' ', p[1], p[3][0]) + p[0] = '%*s%s(%s)' % (INDENT_LEVEL * INDENT_SIZE, ' ', p[1][0], p[3][0]) # A() def p_function_function(p): 'function : FUNCTIONNAME OPENBRACKET CLOSEBRACKET' - p[0] = '%*s%s()' % (INDENT_LEVEL * INDENT_SIZE, ' ', p[1]) + p[0] = '%*s%s()' % (INDENT_LEVEL * INDENT_SIZE, ' ', p[1][0]) def p_resumestatementblocks_resume(p): 'resumestatementblocks : lterm ASSIGNMENT RESUME OPENBRACKET expression CLOSEBRACKET EOL' @@ -937,7 +937,7 @@ def p_term_string_parameter(p): # A(2,3) def p_term_function_parameters(p): 'term : FUNCTIONNAME OPENBRACKET list CLOSEBRACKET' - p[0] = ('%s(%s)' % (p[1], p[3][0]), DOUBLE_TYPE) + p[0] = ('%s(%s)' % (p[1][0], p[3][0]), p[1][1]) # list(2,3) def p_term_list_parameters(p): @@ -952,7 +952,7 @@ def p_term_gettext_parameter(p): # A() def p_term_function(p): 'term : FUNCTIONNAME OPENBRACKET CLOSEBRACKET' - p[0] = ('%s()' % (p[1]), DOUBLE_TYPE) + p[0] = ('%s()' % (p[1][0]), p[1][1]) # list() def p_term_list(p): -- cgit