diff options
-rw-r--r-- | .gitignore | 3 | ||||
-rwxr-xr-x | sci2jslex.py | 23 | ||||
-rwxr-xr-x | sci2jsyacc.py | 66 |
3 files changed, 81 insertions, 11 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..3a08e100 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +__pycache__ +parsetab.py +parser.out diff --git a/sci2jslex.py b/sci2jslex.py index 7150037e..5b0fe4af 100755 --- a/sci2jslex.py +++ b/sci2jslex.py @@ -293,17 +293,18 @@ def t_dqstring_error(t): lexer = lex.lex() -if len(sys.argv) <= 1: - print("Usage: %s filename" % sys.argv[0]) - sys.exit(1) +if __name__ == '__main__': + if len(sys.argv) <= 1: + print("Usage: %s filename" % sys.argv[0]) + sys.exit(1) -filename = sys.argv[1] -data = '' -with open(filename, 'r') as infile: - for line in infile: - data += line + filename = sys.argv[1] + data = '' + with open(filename, 'r') as infile: + for line in infile: + data += line - lexer.input(data) + lexer.input(data) - for tok in lexer: - print(tok) + for tok in lexer: + print(tok) diff --git a/sci2jsyacc.py b/sci2jsyacc.py new file mode 100755 index 00000000..f6ca26d5 --- /dev/null +++ b/sci2jsyacc.py @@ -0,0 +1,66 @@ +#!/usr/bin/python3 + +import sys +import ply.yacc as yacc + +from sci2jslex import tokens + +def p_expression_operator(p): + 'expression : expression OPERATOR term' + p[0] = str(p[1]) + str(p[2]) + str(p[3]) + +def p_expression_term(p): + 'expression : term' + p[0] = str(p[1]) + +def p_term_number(p): + 'term : NUMBER' + p[0] = str(p[1]) + +def p_term_var(p): + 'term : VAR' + p[0] = str(p[1]) + +def p_term_prevar(p): + 'term : PREVAR' + p[0] = str(p[1]) + +def p_term_expression(p): + 'term : OPENBRACKET expression CLOSEBRACKET' + p[0] = str(p[1]) + +def p_term_function(p): + 'term : VAR OPENBRACKET list CLOSEBRACKET' + p[0] = str(p[1]) + +def p_list_list_expression(p): + 'list : list COMMA expression' + p[0] = str(p[1]) + str(p[2]) + str(p[3]) + +def p_list_expression(p): + 'list : expression' + p[0] = str(p[1]) + +def p_list_empty(p): + 'list : ' + p[0] = '' + +def p_error(p): + print("Syntax error in input") + +if __name__ == '__main__': + parser = yacc.yacc() + + if len(sys.argv) <= 1: + print("Usage: %s filename" % sys.argv[0]) + sys.exit(1) + + filename = sys.argv[1] + data = '' + with open(filename, 'r') as infile: + for line in infile: + data += line + + result = parser.parse(data) + + print(result) |