summaryrefslogtreecommitdiff
path: root/sci2jsyacc.py
diff options
context:
space:
mode:
Diffstat (limited to 'sci2jsyacc.py')
-rwxr-xr-xsci2jsyacc.py87
1 files changed, 72 insertions, 15 deletions
diff --git a/sci2jsyacc.py b/sci2jsyacc.py
index df4634b1..9d466a80 100755
--- a/sci2jsyacc.py
+++ b/sci2jsyacc.py
@@ -32,24 +32,26 @@ start = 'functionblocks'
JOB_BLOCKS = {}
+LOCAL_VARS = set()
+GLOBAL_VARS = set()
+
# define functionblocks
def p_functionblocks_functionblocks_functionblock(p):
'functionblocks : functionblocks functionblock'
p[0] = '%s%s' % (p[1], p[2])
-def p_functionblocks_functionblock(p):
- 'functionblocks : EOL functionblock'
+def p_functionblocks_jobfunctionblock(p):
+ 'functionblocks : EOL jobfunctionblock'
p[0] = '%s' % (p[2])
# end functionblocks
# define functionblock
-def p_functionblock_function_job_statementblock_endfunction(p):
- '''functionblock : FUNCTION lterm ASSIGNMENT VAR OPENBRACKET JOB COMMA VAR COMMA VAR CLOSEBRACKET EOL statementblock ENDFUNCTION EOL
- | FUNCTION lterm ASSIGNMENT FUNCTIONCALL OPENBRACKET JOB COMMA VAR COMMA VAR CLOSEBRACKET EOL statementblock ENDFUNCTION EOL'''
- fname = p[4]
+def p_jobfunctionblock_jobfunctionstatement_statementblock_endfunction(p):
+ 'jobfunctionblock : jobfunctionstatement statementblock ENDFUNCTION EOL'
+ fname = '%s' % (p[1])
indent = ' '
p[0] = ('function %s() {\n' +
'%s%s.prototype.define = function %s() {\n%s%s}\n' +
@@ -63,9 +65,20 @@ def p_functionblock_function_job_statementblock_endfunction(p):
indent, fname, fname, (JOB_BLOCKS['"set"'] if '"set"' in JOB_BLOCKS else ''), indent,
)
-def p_functionblock_function_statementblock_endfunction(p):
- '''functionblock : FUNCTION lterm ASSIGNMENT VAR OPENBRACKET list CLOSEBRACKET EOL statementblock ENDFUNCTION EOL
- | FUNCTION lterm ASSIGNMENT FUNCTIONCALL OPENBRACKET list CLOSEBRACKET EOL statementblock ENDFUNCTION EOL'''
+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 FUNCTIONCALL OPENBRACKET JOB COMMA VAR COMMA VAR CLOSEBRACKET EOL'''
+ for var in (p[6], p[8], p[10]):
+ LOCAL_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 FUNCTIONCALL OPENBRACKET list CLOSEBRACKET EOL'''
p[0] = ''
# end define functionblock
@@ -91,6 +104,10 @@ def p_statement_assignment(p):
| RETURN EOL'''
p[0] = '%s;\n' % (p[1])
+def p_statement_functionblock(p):
+ 'statement : functionblock'
+ p[0] = ''
+
def p_statement_resume(p):
'statement : lterm ASSIGNMENT RESUME OPENBRACKET expression CLOSEBRACKET EOL'
p[0] = '%s%s%s(%s)\n' % (p[1], p[2], p[3], p[5])
@@ -231,6 +248,9 @@ def p_forstatement_for_start_step_end(p):
else:
endop = '>='
stepop = '-='
+ if var not in GLOBAL_VARS:
+ if var not in LOCAL_VARS:
+ LOCAL_VARS.add(var)
p[0] = 'for (%s=%s;%s%s%s;%s%s%s) {\n' % (var, lstart, var, endop, lend, var, stepop, lstep)
def p_forstatement_for_start_end(p):
@@ -242,12 +262,18 @@ def p_forstatement_for_start_end(p):
lend = p[6]
endop = '<='
stepop = '+='
+ if var not in GLOBAL_VARS:
+ if var not in LOCAL_VARS:
+ LOCAL_VARS.add(var)
p[0] = 'for (%s=%s;%s%s%s;%s%s%s) {\n' % (var, lstart, var, endop, lend, var, stepop, lstep)
def p_forstatement_for_list(p):
'''forstatement : FOR VAR ASSIGNMENT VAR EOL
| FOR VAR ASSIGNMENT VAR DO EOL'''
var = p[2]
+ if var not in GLOBAL_VARS:
+ if var not in LOCAL_VARS:
+ LOCAL_VARS.add(var)
p[0] = 'for (%s in %s) {\n' % (var, p[4])
def p_selectstatement_select(p):
@@ -502,14 +528,31 @@ def p_ltermvar_ltermvar_dot_in(p):
p[0] = '%s.%s1' % (p[1], p[3])
def p_ltermvar_var(p):
- '''ltermvar : VAR
- | PREVAR'''
- p[0] = '%s' % (p[1])
+ 'ltermvar : VAR'
+ var = p[1]
+ if var not in GLOBAL_VARS:
+ if var not in LOCAL_VARS:
+ LOCAL_VARS.add(var)
+ if var in GLOBAL_VARS:
+ p[0] = '%s' % (var)
+ else:
+ p[0] = '%s' % (var)
# in
def p_ltermvar_in(p):
'ltermvar : IN'
- p[0] = '%s1' % (p[1])
+ var = p[1] + '1'
+ if var not in GLOBAL_VARS:
+ if var not in LOCAL_VARS:
+ LOCAL_VARS.add(var)
+ if var in GLOBAL_VARS:
+ p[0] = '%s' % (var)
+ else:
+ p[0] = '%s' % (var)
+
+def p_ltermvar_prevar(p):
+ 'ltermvar : PREVAR'
+ p[0] = '%s' % (p[1])
# end define lterm
@@ -695,12 +738,26 @@ def p_termvar_termvar_dot_in(p):
# A
def p_termvar_var(p):
'termvar : VAR'
- p[0] = '%s' % (p[1])
+ var = p[1]
+ if var not in GLOBAL_VARS:
+ if var not in LOCAL_VARS:
+ GLOBAL_VARS.add(var)
+ if var in GLOBAL_VARS:
+ p[0] = '%s' % (var)
+ else:
+ p[0] = '%s' % (var)
# in
def p_termvar_in(p):
'termvar : IN'
- p[0] = '%s1' % (p[1])
+ var = p[1] + '1'
+ if var not in GLOBAL_VARS:
+ if var not in LOCAL_VARS:
+ GLOBAL_VARS.add(var)
+ if var in GLOBAL_VARS:
+ p[0] = '%s' % (var)
+ else:
+ p[0] = '%s' % (var)
# 5
# 3.4