view truffle/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/expression/Expression.atg @ 22157:dc83cc1f94f2

Using fully qualified imports
author Jaroslav Tulach <jaroslav.tulach@oracle.com>
date Wed, 16 Sep 2015 11:33:22 +0200
parents 9c8c0937da41
children
line wrap: on
line source

/*
 * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

/*
 * This is the grammar for DSL expressions that is used to automatically generate the Parser.java and Scanner.java
 * files. You can download the parser generator Coco/R from http://ssw.jku.at/coco/. Then run
 * "java -jar Coco.jar Expression.atg"
 */

COMPILER Expression

CHARACTERS

letter = 'A' .. 'Z' + 'a' .. 'z' + '_' + '$'.
nonZeroDigit = "123456789".
digit = '0' + nonZeroDigit .
hexDigit = "0123456789abcdefABCDEF".
octDigit = "01234567".
binaryDigit = "01".

TOKENS

identifier = letter {letter | digit}.
numericLiteral = "0" ( "x" { hexDigit } | "b" { binaryDigit } | { octDigit } ) | nonZeroDigit { digit }.

PRAGMAS

PRODUCTIONS


Expression<out DSLExpression result>
=
LogicFactor<out result>
.


LogicFactor<out DSLExpression  result>
=
ComparisonFactor<out result>
[
    ("||")                                      (. Token op = t; .)
    ComparisonFactor<out DSLExpression  right>  (.  result = new Binary(op.val, result, right); .)
]
.

ComparisonFactor<out DSLExpression  result>
=
NegateFactor<out result>
[
    ("<" | "<=" | ">" | ">=" | "==" | "!=" )    (. Token op = t; .)
    NegateFactor<out DSLExpression  right>      (.  result = new Binary(op.val, result, right); .)
]
.


NegateFactor<out DSLExpression  result>
=                                               (. boolean negated = false; .)
[
    "!"                                         (. negated = true; .)
]                                        
    Factor<out result>                          (. result = negated ? new Negate(result) : result;.)
.


Factor<out DSLExpression result>
=                                               (. result = null; .)

(
    MemberExpression<out result, result>
|
    numericLiteral                              (. result = new IntLiteral(t.val); .)
|
    "("                                        
    Expression<out result>                      
    ")"                                        
                                                
)
.

MemberExpression<out DSLExpression result, DSLExpression receiver>
=                                               (. result = null; .)
(
    
    identifier                                  (. Variable variable = new Variable(receiver, t.val); .)
                                                (. result = variable; .)
[

    "("                                         (. List<DSLExpression> parameters = new ArrayList<>();
                                                   DSLExpression parameter; .)
    [
        Expression<out parameter>               (. parameters.add(parameter); .)
        {
            ","
            Expression<out parameter>           (. parameters.add(parameter); .)
        }
    ]
    ")"                                         (. result = new Call(variable.getReceiver(), variable.getName(), parameters); .)
]
                                                
)
[
   "." MemberExpression<out result, result>
]
.
END Expression.