def p_singletontuple(p): '''singletontuple : nonempty_expressionlist COMMA''' p[0] = ast(p, "TUPLE_SINGLE", 1)
def p_defaultlist_single(p): '''nonempty_defaultlist : IDENTIFIER COLON QMARK type''' p[0] = ast(p, "DEFAULTLIST_SINGLE", 1, 4)
def p_procedure_type(p): # proc (string) '''procedure_type : PROC LPAREN typelist RPAREN''' p[0] = ast(p, "PROCEDURE_TYPE", 3)
def p_argumentlist_single(p): '''nonempty_argumentlist : IDENTIFIER COLON type''' p[0] = ast(p, "ARGUMENTLIST_SINGLE", 1, 3)
def p_argumentlist_multi(p): '''nonempty_argumentlist : nonempty_argumentlist COMMA nonempty_argumentlist''' p[0] = ast(p, "ARGUMENTLIST_MULTI", 1, 3)
def p_function_definition(p): # def add(x : int, y : int) -> int '''function_definition : DEF IDENTIFIER LPAREN argumentlist RPAREN ARROW type NL''' p[0] = ast(p, "FUNCTION_DEFINITION", 2, 4, 7)
def p_argumentlist(p): '''argumentlist : nonempty_argumentlist COMMA nonempty_defaultlist | nonempty_argumentlist empty empty | empty empty empty''' p[0] = ast(p, "ARGUMENTLIST", 1, 3)
def p_importlist_single(p): '''importlist : IDENTIFIER''' p[0] = ast(p, "IMPORTLIST_SIMPLE", 1)
def p_importlist_alias(p): '''importlist : IDENTIFIER AS IDENTIFIER''' p[0] = ast(p, "IMPORTLIST_ALIAS", 1, 3)
def p_dictionary_literal(p): # { 1 : "a", 2 : "b" } '''dictionary_literal : LCURLY dictionarylist RCURLY''' p[0] = ast(p, "LITERAL_DICTIONARY", 2)
def p_pyimport_statement_discrete(p): # from module pyimport fn1, fn2... '''pyimport_statement : FROM IDENTIFIER PYIMPORT importlist NL''' p[0] = ast(p, "PYIMPORT_DISCRETE", 2, 4)
def p_list_literal(p): # [], [1], [1,2] '''list_literal : LBRACKET expressionlist RBRACKET''' p[0] = ast(p, "LITERAL_LIST", 2)
def p_crosstuple(p): '''crosstuple : nonempty_expressionlist''' p[0] = ast(p, "MULTI_TUPLE", 1)
def p_singleimport(p): '''singleimport : import_statement | pyimport_statement''' p[0] = ast(p, "IMPORTBLOCK_SINGLE", 1)
def p_class_suite(p): '''class_suite : optdoc declaration_suite''' p[0] = ast(p, "CLASS_SUITE", 1, 2)
def p_importlist_multi(p): '''importlist : importlist COMMA importlist''' p[0] = ast(p, "IMPORTLIST_MULTI", 1, 3)
def p_methodblock(p): '''methodblock : subroutine_definition methodblock''' p[0] = ast(p, "METHODBLOCK", 1, 2)
def p_declaration_suite(p): '''declaration_suite : variableblock classblock methodblock''' p[0] = ast(p, "DECLARATION_SUITE", 1, 2, 3)
def p_procedure_definition(p): # def write(s:string) '''procedure_definition : DEF IDENTIFIER LPAREN argumentlist RPAREN NL''' p[0] = ast(p, "PROCEDURE_DEFINITION", 2, 4)
def p_nonempty_variableblock_single(p): # :: x : int :: '''nonempty_variableblock : declaration''' p[0] = ast(p, "VARIABLEBLOCK_SINGLE", 1)
def p_argumentlist_default(p): '''argumentlist : nonempty_defaultlist empty empty''' p[0] = ast(p, "ARGUMENTLIST", 3, 1)
def p_nonempty_variableblock_multi(p): # :: x : int, y : string :: '''nonempty_variableblock : nonempty_variableblock COMMA nonempty_variableblock''' p[0] = ast(p, "VARIABLEBLOCK_MULTI", 1, 3)
def p_file(p): '''file : optdoc importblock declaration_suite''' p[0] = ast(p, "FILE", 1, 2, 3)
def p_declaration_simple(p): # x : int '''declaration : IDENTIFIER COLON type''' p[0] = ast(p, "DECLARATION_SIMPLE", 1, 3)
def p_defaultlist_multi(p): '''nonempty_defaultlist : nonempty_defaultlist COMMA nonempty_defaultlist''' p[0] = ast(p, "DEFAULTLIST_MULTI", 1, 3)
def p_classblock(p): '''classblock : class_definition classblock''' p[0] = ast(p, "CLASSBLOCK", 1, 2)
def p_function_type(p): '''function_type : FN LPAREN typelist RPAREN ARROW type''' p[0] = ast(p, "FUNCTION_TYPE", 3, 6)
def p_class_definition(p): # class Pet: # class Dog extends Pet: '''class_definition : CLASS IDENTIFIER opt_extends COLON NL INDENT class_suite DEDENT''' p[0] = ast(p, "CLASS_DEFINITION", 2, 3, 7)
def p_nonempty_typelist_single(p): '''nonempty_typelist : type''' p[0] = ast(p, "TYPELIST_SINGLE", 1)
def p_tuple_literal(p): # (1,) # (1,2) '''tuple_literal : LPAREN tuplelist RPAREN''' p[0] = ast(p, "LITERAL_TUPLE", 2)