You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

82 lines
2.1 KiB

/*
* Copyright (c) 2013 - present Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
%{
%}
%token DOT SEMICOLON COLON COMMA SINGLE_QUOTE DOUBLE_QUOTE REV_QUOTE
%token PERCENT AMPERSAND EXCLAMATION EQUAL MINUS PLUS EQUALEQUAL EXCLAMATIONEQUAL
%token LEFT_CHEVRON RIGHT_CHEVRON LEFT_PARENTHESIS RIGHT_PARENTHESIS LEFT_SQBRACKET RIGHT_SQBRACKET
%token STAR PIPE SLASH BACKSLASH
%token IF DOTDOTDOT SOURCE ERROR
%token <string> HEXA
%token <string> NUMBER
%token <string> IDENT
%token <string> CONST_STRING
%token <string> ATTRIBUTE
%token EOF
%start query
%type <CodeQueryAst.query option> query
%%
ident:
| IDENT { $1 }
;
expr:
| ident { if $1 = "null" then CodeQueryAst.Null else CodeQueryAst.Ident $1 }
| CONST_STRING { CodeQueryAst.ConstString $1 }
;
condition:
| expr EQUALEQUAL expr { ($1, "==", $3) }
| expr EXCLAMATIONEQUAL expr { ($1, "!=", $3) }
;
param_element:
| expr { $1 }
;
param_element_list_nonempty:
| param_element { [$1] }
| param_element COMMA param_element_list_nonempty { $1 :: $3 }
;
param_element_list:
| { [] }
| param_element_list_nonempty { $1 }
;
call_params:
| STAR { None }
| param_element_list { Some $1 }
;
rule:
| expr LEFT_PARENTHESIS expr RIGHT_PARENTHESIS { CodeQueryAst.Call ($1, $3) }
| expr DOT expr LEFT_PARENTHESIS call_params RIGHT_PARENTHESIS { CodeQueryAst.MethodCall($1, $3, $5) }
| IF LEFT_PARENTHESIS condition RIGHT_PARENTHESIS DOTDOTDOT rule { let x, y, z = $3 in CodeQueryAst.If (x, y, z, $6) }
;
action:
| { CodeQueryAst.Noaction }
| SOURCE SEMICOLON { CodeQueryAst.Source None }
| SOURCE LEFT_PARENTHESIS NUMBER COMMA NUMBER RIGHT_PARENTHESIS SEMICOLON { CodeQueryAst.Source (Some (int_of_string $3, int_of_string $5)) }
| ERROR SEMICOLON { CodeQueryAst.Error None }
| ERROR LEFT_PARENTHESIS ident RIGHT_PARENTHESIS SEMICOLON { CodeQueryAst.Error (Some $3) }
query:
| rule SEMICOLON action { Some ($1,$3) }
| EOF { None }
;