blob: 68018712f4db8d7e97a0dc106252a568817d197b [file] [log] [blame]
%{
// Copyright 2018 syzkaller project authors. All rights reserved.
// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.
// +build !codeanalysis
package parser
%}
%start syscall
%union {
data string
val_int int64
val_double float64
val_ret_type int64
val_uint uint64
val_constant Constant
val_identifiers []*BufferType
val_buf_type *BufferType
val_group_type *GroupType
val_type IrType
val_types []IrType
val_syscall *Syscall
}
%token <data> STRING_LITERAL IPV6 IDENTIFIER FLAG DATETIME SIGNAL_PLUS SIGNAL_MINUS MAC
%token <val_int> INT
%token <val_uint> UINT
%token <val_double> DOUBLE
%type <val_ret_type> ret_type
%type <val_buf_type> buf_type
%type <val_group_type> group_type
%type <val_constant> constant
%type <val_type> parenthetical, parentheticals, type, field_type
%type <val_types> types
%type <val_syscall> syscall
%token STRING_LITERAL MAC IDENTIFIER FLAG INT UINT QUESTION DOUBLE ARROW
%token OR AND LOR TIMES LAND LEQUAL ONESCOMP LSHIFT RSHIFT TIMES NOT MINUS PLUS
%token COMMA LBRACKET RBRACKET LBRACKET_SQUARE RBRACKET_SQUARE LPAREN RPAREN EQUALS
%token UNFINISHED RESUMED
%token SIGNAL_PLUS SIGNAL_MINUS NULL EQUALAT COLON FORWARDSLASH
%nonassoc LOWEST
%nonassoc NOFLAG
%nonassoc LBRACKET_SQUARE
%left OR
%left AND
%left LSHIFT RSHIFT
%left PLUS
%left MINUS
%left TIMES
%right NEG ONESCOMP
%left COLON
%left ARROW
%left EQUALS
%left EQUALAT
%%
syscall:
IDENTIFIER LPAREN types UNFINISHED %prec NOFLAG { $$ = NewSyscall(-1, $1, $3, int64(-1), true, false);
Stracelex.(*Stracelexer).result = $$ }
| RESUMED UNFINISHED RPAREN EQUALS QUESTION %prec NOFLAG
{
$$ = NewSyscall(-1, "tmp", nil, -1, true, true);
Stracelex.(*Stracelexer).result = $$
}
| IDENTIFIER LPAREN RESUMED RPAREN EQUALS INT %prec NOFLAG
{
$$ = NewSyscall(-1, $1, nil, int64($6), false, false);
Stracelex.(*Stracelexer).result = $$
}
| RESUMED types RPAREN EQUALS ret_type %prec NOFLAG { $$ = NewSyscall(-1, "tmp", $2, $5, false, true);
Stracelex.(*Stracelexer).result = $$ }
| RESUMED types RPAREN EQUALS QUESTION %prec NOFLAG { $$ = NewSyscall(-1, "tmp", $2, -1, false, true);
Stracelex.(*Stracelexer).result = $$ }
| RESUMED types RPAREN EQUALS ret_type LPAREN parentheticals RPAREN { $$ = NewSyscall(-1, "tmp", $2, $5, false, true);
Stracelex.(*Stracelexer).result = $$ }
| RESUMED types RPAREN EQUALS ret_type FLAG LPAREN parentheticals RPAREN { $$ = NewSyscall(-1, "tmp", $2, $5, false, true);
Stracelex.(*Stracelexer).result = $$ }
| IDENTIFIER LPAREN types RPAREN EQUALS ret_type %prec NOFLAG{
$$ = NewSyscall(-1, $1, $3, $6, false, false);
Stracelex.(*Stracelexer).result = $$}
| IDENTIFIER LPAREN types RPAREN EQUALS QUESTION %prec NOFLAG {
$$ = NewSyscall(-1, $1, $3, -1, false, false);
Stracelex.(*Stracelexer).result = $$}
| IDENTIFIER LPAREN types RPAREN EQUALS ret_type FLAG LPAREN parentheticals RPAREN {
$$ = NewSyscall(-1, $1, $3, $6, false, false);
Stracelex.(*Stracelexer).result = $$}
| IDENTIFIER LPAREN types RPAREN EQUALS ret_type LPAREN parentheticals RPAREN {
$$ = NewSyscall(-1, $1, $3, $6, false, false);
Stracelex.(*Stracelexer).result = $$}
| INT syscall {call := $2; call.Pid = $1; Stracelex.(*Stracelexer).result = call}
parentheticals:
parenthetical {$$ = nil}
| parentheticals parenthetical {$$ = nil}
parenthetical:
COMMA {$$=nil}
| OR {$$ = nil}
| AND {$$ = nil}
| LSHIFT {$$ = nil}
| RSHIFT {$$ = nil}
| IDENTIFIER {$$ = nil}
| FORWARDSLASH {$$ = nil}
| group_type {$$ = nil}
| FLAG {$$ = nil}
| INT {$$ = nil}
| UINT {$$ = nil}
ret_type:
INT {$$ = $1}
| UINT {$$ = int64($1)}
| MINUS INT {$$ = -1 * $2}
types:
{$$ = []IrType{}}
| types COMMA type {$1 = append($1, $3); $$ = $1}
| types type {$1 = append($1, $2); $$ = $1}
type:
buf_type {$$ = $1}
| field_type {$$ = $1}
| group_type {$$ = $1}
| constant %prec LOWEST {$$ = $1}
| ONESCOMP group_type {$$ = $2}
constant:
INT {$$ = Constant($1)}
| UINT {$$ = Constant($1)}
| NULL {$$ = Constant(uint64(0))}
| constant OR constant {$$ = $1 | $3}
| constant AND constant {$$ = $1 & $3}
| constant LSHIFT constant {$$ = $1 << $3}
| constant RSHIFT constant {$$ = $1 >> $3}
| LPAREN constant RPAREN {$$ = $2}
| constant TIMES constant {$$ = $1 * $3}
| constant MINUS constant {$$ = $1 - $3}
| constant PLUS constant {$$ = $1 + $3}
| ONESCOMP constant {$$ = ^$2}
| MINUS constant %prec NEG {$$ = Constant(-int64($2))}
group_type:
LBRACKET_SQUARE types RBRACKET_SQUARE {$$ = newGroupType($2)}
| LBRACKET types RBRACKET {$$ = newGroupType($2)}
| LBRACKET types COMMA RBRACKET {$$ = newGroupType($2)}
field_type:
type COLON type {$$ = $3}
| type EQUALAT type {$$ = $3}
| type EQUALS type {$$ = $3}
| type ARROW type {$$ = $1}
| IDENTIFIER LBRACKET_SQUARE FLAG RBRACKET_SQUARE EQUALS type {$$ = $6}
buf_type:
STRING_LITERAL {$$ = newBufferType($1)}
| IDENTIFIER %prec LOWEST {$$ = newBufferType($1)}
| DATETIME {$$ = newBufferType($1)}
| MAC {$$ = newBufferType($1)}