Anarres-Mud-Driver
view release on metacpan or search on metacpan
Compiler/parser.y view on Meta::CPAN
if (count != 1)
croak("No returned value from apply %s\n", func);
node = POPs;
SvREFCNT_inc(node);
PUTBACK;
FREETMPS;
LEAVE;
return node;
}
%}
%token L_BREAK L_CASE L_CATCH L_CLASS L_CONTINUE L_DEFAULT L_DO
%token L_EFUN L_ELSE L_FOR L_FOREACH L_IF L_IN L_INHERIT L_NEW
%token L_NIL L_RETURN L_RLIMITS L_SWITCH L_SSCANF L_TRY L_WHILE
%token L_MAP_START L_MAP_END
%token L_ARRAY_START L_ARRAY_END
%token L_FUNCTION_START L_FUNCTION_END
%token L_PARAMETER L_IDENTIFIER L_NIL L_STRING L_CHARACTER
%token L_INTEGER L_HEXINTEGER
%token L_BASIC_TYPE L_TYPE_MODIFIER L_STATIC
%token L_INHERIT L_COLONCOLON
%token L_IF L_DO L_WHILE L_FOR L_FOREACH L_IN L_RLIMITS
%token L_TRY L_CATCH
%token L_SWITCH L_CASE L_BREAK
%token L_CONTINUE L_RETURN L_ELSE
%token L_VOID L_ELLIPSIS
%token L_ARROW L_RANGE
%nonassoc LOWER_THAN_ELSE
%nonassoc L_ELSE
/* Strictly these can be %token */
%nonassoc L_PLUS_EQ L_MINUS_EQ L_DIV_EQ L_TIMES_EQ
%nonassoc L_MOD_EQ L_AND_EQ L_OR_EQ L_XOR_EQ L_DOT_EQ
/* Is this the right place? */
%nonassoc L_LOR_EQ L_LAND_EQ
/* %left CONST */
%right '?'
%left L_LOR
%left L_LAND
%left '|'
%left '^'
%left '&'
%left L_EQ L_NE
%left L_GE L_LE '<' '>'
%left L_LSH L_RSH
%left '.'
%left '+' '-'
%left '*' '%' '/'
%right '!' '~'
%nonassoc L_INC L_DEC
/* These aren't strictly necessary, but they help debugging. */
%token '{' '}' ',' ';' ':' '(' ')' '[' ']' '=' '$'
/* I should have a new type 'node' in here for blessed objects
* which are specifically parse nodes. */
/* It is very very tempting to expand this to say 12 bytes
* to save on the use of AVs for type declarators. */
%union {
int number;
const char *str;
SV *sv;
SV *obj;
AV *av;
struct _assoc_t {
SV *key;
SV *value;
} assoc;
}
%{
/* This declares either yylex or yylex_verbose, according to
* the macros above. This is a bit obscure and occasionally
* highly fucked up. */
int yylex(YYSTYPE *yylval, amd_parse_param_t *param);
%}
/* %TYPES */
%type <av> function_declarator
%type <av> argument_list arguments
%type <sv> argument
%type <sv> function_prologue
%type <av> variable_declarator variable_declarator_list
%type <av> variable_declarator_init variable_declarator_list_init
%type <str> L_VOID L_BASIC_TYPE
/* This might point into an SvPV in the type cache. */
%type <str> type_specifier
/* An SvPV. */
%type <sv> star_list
%type <number> opt_endrange
%type <number> type_modifier_list L_TYPE_MODIFIER
%type <av> class_member_list class_member
%type <number> L_PARAMETER
%type <number> integer L_INTEGER L_HEXINTEGER L_CHARACTER
%type <sv> L_STRING string string_const
%type <sv> L_IDENTIFIER identifier
%type <obj> function_name
%type <assoc> assoc_exp
%type <av> arg_list opt_arg_list opt_arg_list_comma
%type <av> assoc_arg_list opt_assoc_arg_list_comma
%type <av> array mapping
%type <obj> lvalue
%type <av> lvalue_list
Compiler/parser.y view on Meta::CPAN
| string L_STRING
{
sv_catpv($1, SvPVX($2));
SvREFCNT_dec($2);
$$ = $1;
}
;
integer
: L_INTEGER
| L_CHARACTER
;
array
: L_ARRAY_START opt_arg_list_comma L_ARRAY_END
{
$$ = $2;
}
;
mapping
: L_MAP_START opt_assoc_arg_list_comma L_MAP_END
{
/* This doesn't expand the pairs into a single list.
* There is a hack elsewhere. */
$$ = $2;
}
;
/* Also things like (: foo :) ? */
closure
: L_FUNCTION_START list_exp L_FUNCTION_END
{
$$ = $2;
}
;
%%
const char *
yytokname(int i)
{
return yytname[YYTRANSLATE(i)];
}
int
yyparser_parse(SV *program, const char *str)
{
amd_parse_param_t param;
int ret;
// fprintf(stderr, "Start of yyparser_parse\n");
// fflush(stderr);
memset(¶m, 0, sizeof(param));
param.program = program;
param.symtab = newHV();
yylex_init(str);
#if YYDEBUG != 0
yydebug = 1;
#endif
ret = yyparse((void *)(¶m));
/* Delete the HV but not the contents. */
hv_undef(param.symtab);
return ret;
}
( run in 0.906 second using v1.01-cache-2.11-cpan-39bf76dae61 )