|
|
JavaScript Parser Example
// =================================================================
// ProGrammar Grammar Definition File
// -----------------------------------------------------------------
//
// JavaScript.GDL - grammar for parsing JavaScript 1.2
//
// This example is intended for demonstration purposes only.
//
// (c) Copyright 1999, 2000 NorKen Technologies, Inc.
// All rights reserved.
//
// ==================================================================
grammar JavaScript
{
statements ::=
{statement};
block ::=
"{" statements "}";
statement ::=
( break_stmt // navigator 2.0
| continue_stmt // navigator 2.0
| delete_stmt // navigator 4.0
| do_while_stmt // navigator 4.0
| export_stmt // navigator 4.0
| for_stmt // navigator 2.0
| for_in_stmt // navigator 2.0
| function_stmt // navigator 2.0
| if_else_stmt // navigator 2.0
| import_stmt // navigator 4.0
| labeled_stmt // navigator 4.0
| return_stmt // navigator 2.0
| switch_stmt // navigator 4.0
| variable_stmt // navigator 2.0
| while_stmt // navigator 2.0
| with_stmt // navigator 2.0
| block
| expression ) [";"]
;
break_stmt ::=
"break" [label];
continue_stmt ::=
"continue" [label];
delete_stmt ::=
"delete" qualified_name [subscript];
do_while_stmt ::=
"do" statement
"while" "(" condition ")" ;
export_stmt ::=
"export"
("*" | {qualified_name, ","});
for_stmt ::=
"for" "(" [initial_expression ";"]
[condition ";"]
[increment_expression] ")"
statement;
initial_expression ::=
variable_stmt
| expression_list ;
increment_expression ::=
expression_list ;
for_in_stmt ::=
"for" "(" variable "in" object ")"
statement;
function_stmt ::=
"function" name
"(" [params] ")"
block;
params ::=
{ident, ","};
if_else_stmt ::=
"if" "(" condition ")"
statement1
["else" statement2] ;
statement1 ::=
statement;
statement2 ::=
statement;
import_stmt ::=
"import"
(name "." "*"
| {qualified_name, ","});
labeled_stmt ::=
label ":" statement ;
return_stmt ::=
"return" expression;
switch_stmt ::=
"switch" "(" expression ")"
"{"
[{ case_part }]
[default_part]
"}" ;
case_part ::=
"case" label ":" statements;
default_part ::=
"default" ":" statements;
variable_stmt ::=
"var" {var_decl, ","};
var_decl ::=
name ["=" value];
while_stmt ::=
"while" "(" condition ")"
statement;
with_stmt ::=
"with" "(" object ")"
statement;
value ::=
expression;
name ::=
ident;
variable ::=
qualified_name;
object ::=
qualified_name;
condition ::=
expression;
subscript ::=
"[" index "]";
index ::= numeric;
qualified_name ::=
{ident, "."};
label ::=
ident;
// -------------------------------------------------------------------
//
// EXPRESSIONS
//
// -------------------------------------------------------------------
// the following rules establish operator precedence
// (increasing precedence for each successive rule)
expression ::=
assign_term;
assign_term ::= { ternary_term, assign_level_op };
// assignment is lowest precedence
ternary_term ::= or_term ["?" expression ":" expression];
or_term ::= { and_term, or_level_op };
and_term ::= { bit_term, and_level_op };
bit_term ::= { cmp_term, bit_level_op };
cmp_term ::= { shift_term, cmp_level_op };
shift_term ::= { add_term, shift_level_op };
add_term ::= { mult_term, add_level_op };
mult_term ::= { factor, mult_level_op };
factor ::=
"!" expression
| "(" expression ")" ["." reference]
| unary_op expression
| creating_expression
| literal_expression
| [prefix_op] reference [postfix_op]
;
// operators
assign_level_op ::= ("=" | "*=" | "/=" | "%=" | "+=" | "-="
| "<<=" | ">>=" | ">>>=" | "&=" | "^=" | "|=");
or_level_op ::= "||";
and_level_op ::= "&&" ;
bit_level_op ::= "|" | "^" | "&";
cmp_level_op ::= "==" | "!=" | "<" | ">" | ">=" | "<=";
shift_level_op ::= ">>>" | ">>" | "<<";
add_level_op ::= "+" | "-";
mult_level_op ::= "/" | "*" | "%";
unary_op ::= "-" | "~" | "+";
prefix_op ::= "++" | "--";
postfix_op ::= "++" | "--";
expression_list ::=
{expression, ","};
reference ::=
{reference_term, "."};
reference_term ::=
ident [{ "[" expression "]" | "(" [argument_list] ")" }];
argument_list ::= {expression, ","};
creating_expression ::=
"new"
( qualified_name "(" [argument_list] ")"
| ["[" expression "]"] ["[""]"]
["=" value]
| "(" expression ")" )
;
literal_expression ::=
numeric_literal
| string
| character
;
ident ::=
^keyword identifier;
keyword ::=
"break"
| "continue"
| "delete"
| "do"
| "while"
| "export"
| "for"
| "in"
| "function"
| "if"
| "else"
| "import"
| "return"
| "switch"
| "case"
| "default"
| "var"
| "while"
| "with"
| "new"
;
numeric_literal ::=
'0[xX][0-9a-fA-F]+' // hex constant
| (numeric ["." numeric] | "." numeric)
[exponent_part][float_type_suffix]
;
exponent_part ::= "e" ("+" | "-") numeric;
float_type_suffix ::= "f" | "d";
string ::= quotedstring;
character ::=
"\'"
["\\"] ( numeric | '.' )
"\'";
// this example uses the SPACE attribute to skip comments in
// the Java file
space_symbol ::=
{ ( "\32" | "\r" |"\n"|"\t")
| "//" *("\n")
| "/*" *("*/") "*/",,0 };
};
|