805 lines
30 KiB
Scheme
805 lines
30 KiB
Scheme
(module advanced-parser mzscheme
|
|
|
|
(require "general-parsing.ss"
|
|
"lexer.ss"
|
|
"../ast.ss"
|
|
"../parameters.ss")
|
|
|
|
(require (lib "yacc.ss" "parser-tools")
|
|
(all-except (lib "lex.ss" "parser-tools") input-port)
|
|
(lib "readerr.ss" "syntax"))
|
|
|
|
;(require (lib "build-grammar.ss" "tester"))
|
|
|
|
(define-syntax testing-parser
|
|
(syntax-rules ()
|
|
((_ parse-info ...) (parser parse-info ...))))
|
|
|
|
(provide parse-advanced parse-advanced-interactions parse-advanced-expression parse-advanced-type)
|
|
;(provide advanced-grammar)
|
|
|
|
(define parsers
|
|
(parser
|
|
(start CompilationUnit AdvancedInteractions VariableInitializer Type)
|
|
;;(debug "parser.output")
|
|
(tokens java-vals special-toks Keywords Separators EmptyLiterals Operators)
|
|
;(terminals val-tokens special-tokens keyword-tokens separator-tokens literal-tokens operator-tokens)
|
|
(error (lambda (tok-ok name val start-pos end-pos)
|
|
(if ((determine-error))
|
|
(raise-read-error (format "Parse error near <~a:~a>" name val)
|
|
(file-path)
|
|
(position-line start-pos)
|
|
(position-col start-pos)
|
|
(+ (position-offset start-pos) (interactions-offset))
|
|
(- (position-offset end-pos)
|
|
(position-offset start-pos))))))
|
|
|
|
(end EOF)
|
|
(src-pos)
|
|
|
|
(grammar
|
|
|
|
;; 19.3
|
|
(Literal
|
|
[(INTEGER_LIT) (make-literal 'int (build-src 1) $1)]
|
|
[(LONG_LIT) (make-literal 'long (build-src 1) $1)]
|
|
[(FLOAT_LIT) (make-literal 'float (build-src 1) $1)]
|
|
[(DOUBLE_LIT) (make-literal 'double (build-src 1) $1)]
|
|
[(TRUE_LIT) (make-literal 'boolean (build-src 1) #t)]
|
|
[(FALSE_LIT) (make-literal 'boolean (build-src 1) #f)]
|
|
[(CHAR_LIT) (make-literal 'char (build-src 1) $1)]
|
|
[(STRING_LIT) (make-literal 'string
|
|
(make-src (position-line $1-start-pos)
|
|
(position-col $1-start-pos)
|
|
(+ (position-offset $1-start-pos) (interactions-offset))
|
|
(- (position-offset (cadr $1)) (position-offset $1-start-pos))
|
|
(file-path))
|
|
(car $1))]
|
|
[(NULL_LIT) (make-literal 'null (build-src 1) #f)])
|
|
|
|
;; 19.4
|
|
(Type
|
|
[(PrimitiveType) $1]
|
|
[(ReferenceType) $1])
|
|
|
|
(PrimitiveType
|
|
[(NumericType) $1]
|
|
[(boolean) (make-type-spec 'boolean 0 (build-src 1))])
|
|
|
|
(NumericType
|
|
[(IntegralType) $1]
|
|
[(FloatingPointType) $1])
|
|
|
|
(IntegralType
|
|
[(byte) (make-type-spec 'byte 0 (build-src 1))]
|
|
[(short) (make-type-spec 'short 0 (build-src 1))]
|
|
[(int) (make-type-spec 'int 0 (build-src 1))]
|
|
[(long) (make-type-spec 'long 0 (build-src 1))]
|
|
[(char) (make-type-spec 'char 0 (build-src 1))])
|
|
|
|
(FloatingPointType
|
|
[(float) (make-type-spec 'float 0 (build-src 1))]
|
|
[(double) (make-type-spec 'double 0 (build-src 1))])
|
|
|
|
(ReferenceType
|
|
[(Name) (make-type-spec $1 0 (build-src 1))]
|
|
[(ArrayType) $1]
|
|
)
|
|
|
|
(ClassOrInterfaceType
|
|
[(Name) $1])
|
|
|
|
(ClassType
|
|
[(ClassOrInterfaceType) $1])
|
|
|
|
(InterfaceType
|
|
[(ClassOrInterfaceType) $1])
|
|
|
|
(ArrayType
|
|
[(PrimitiveType Dims) (make-type-spec (type-spec-name $1) $2 (build-src 2))]
|
|
[(Name Dims) (make-type-spec $1 $2 (build-src 2))])
|
|
|
|
;;19.5
|
|
(Name
|
|
[(IDENTIFIER) (make-name (make-id $1 (build-src 1)) null (build-src 1))]
|
|
[(Name PERIOD IDENTIFIER)
|
|
(make-name (make-id $3 (build-src 3 3))
|
|
(append (name-path $1) (list (name-id $1)))
|
|
(build-src 3))])
|
|
;; 19.6
|
|
(CompilationUnit
|
|
[(PackageDeclaration ImportDeclarations TypeDeclarations)
|
|
(make-package $1 (reverse $2) (reverse $3))]
|
|
[(ImportDeclarations TypeDeclarations) (make-package #f (reverse $1) (reverse $2))]
|
|
[(PackageDeclaration TypeDeclarations) (make-package $1 null (reverse $2))]
|
|
[(PackageDeclaration ImportDeclarations) (make-package $1 (reverse $2) null)]
|
|
[(PackageDeclaration) (make-package $1 null null)]
|
|
[(ImportDeclarations) (make-package #f (reverse $1) null)]
|
|
[(TypeDeclarations) (make-package #f null (reverse $1))]
|
|
[() (make-package #f null null)])
|
|
|
|
(AdvancedInteractions
|
|
[(Statement) $1]
|
|
[(FieldDeclaration) $1]
|
|
[(Expression) $1]
|
|
[() null])
|
|
|
|
(ImportDeclarations
|
|
[(ImportDeclaration) (list $1)]
|
|
[(ImportDeclarations ImportDeclaration) (cons $2 $1)])
|
|
|
|
(TypeDeclarations
|
|
[(TypeDeclaration) (if $1
|
|
(list $1)
|
|
null)]
|
|
[(TypeDeclarations TypeDeclaration) (if $2
|
|
(cons $2 $1)
|
|
$1)])
|
|
|
|
(PackageDeclaration
|
|
[(package Name SEMI_COLON) $2])
|
|
|
|
(ImportDeclaration
|
|
[(SingleTypeImportDeclaration) $1]
|
|
[(TypeImportOnDemandDeclaration) $1])
|
|
|
|
(SingleTypeImportDeclaration
|
|
[(import Name SEMI_COLON) (make-import $2 #f (build-src 1) (build-src 3) (file-path))])
|
|
|
|
(TypeImportOnDemandDeclaration
|
|
[(import Name PERIOD * SEMI_COLON)
|
|
(make-import $2 #t (build-src 1) (build-src 5) (file-path))])
|
|
|
|
(TypeDeclaration
|
|
[(ClassDeclaration) $1]
|
|
[(InterfaceDeclaration) $1]
|
|
[(INTERACTIONS_BOX) $1]
|
|
[(CLASS_BOX) (parse-class-box $1 (build-src 1) 'advanced)]
|
|
[(TEST_SUITE) $1]
|
|
[(EXAMPLE) $1]
|
|
[(SEMI_COLON) #f])
|
|
|
|
;; 19.7
|
|
(Modifiers
|
|
[(Modifier) (list $1)]
|
|
[(Modifiers Modifier) (cons $2 $1)])
|
|
|
|
(Modifier
|
|
[(public) (make-modifier 'public (build-src 1))]
|
|
[(protected) (make-modifier 'protected (build-src 1))]
|
|
[(private) (make-modifier 'private (build-src 1))]
|
|
[(static) (make-modifier 'static (build-src 1))]
|
|
[(abstract) (make-modifier 'abstract (build-src 1))])
|
|
|
|
;; 19.8.1
|
|
(ClassDeclaration
|
|
[(Modifiers class IDENTIFIER Super Interfaces ClassBody)
|
|
(make-class-def (make-header (make-id $3 (build-src 3 3)) $1 $4 $5 null (build-src 5))
|
|
$6
|
|
(build-src 2 2)
|
|
(build-src 6)
|
|
(file-path)
|
|
'advanced
|
|
null 'top null)]
|
|
[(class IDENTIFIER Super Interfaces ClassBody)
|
|
(make-class-def (make-header (make-id $2 (build-src 2 2)) null $3 $4 null (build-src 4))
|
|
$5
|
|
(build-src 1)
|
|
(build-src 5)
|
|
(file-path)
|
|
'advanced
|
|
null 'top null)])
|
|
|
|
(Super
|
|
[() null]
|
|
[(extends ClassType) (list $2)])
|
|
|
|
(Interfaces
|
|
[() null]
|
|
[(implements InterfaceTypeList) $2])
|
|
|
|
(InterfaceTypeList
|
|
[(InterfaceType) (list $1)]
|
|
[(InterfaceTypeList COMMA InterfaceType) (cons $3 $1)])
|
|
|
|
(ClassBody
|
|
[(O_BRACE ClassBodyDeclarations C_BRACE) (reverse $2)])
|
|
|
|
(ClassBodyDeclarations
|
|
[() null]
|
|
[(ClassBodyDeclarations ClassBodyDeclaration)
|
|
(cond
|
|
((not $2) $1)
|
|
((list? $2) (append $2 $1))
|
|
(else (cons $2 $1)))])
|
|
|
|
(ClassBodyDeclaration
|
|
[(ClassMemberDeclaration) $1]
|
|
[(StaticInitializer) $1]
|
|
[(ConstructorDeclaration) $1]
|
|
[(SEMI_COLON) #f])
|
|
|
|
(ClassMemberDeclaration
|
|
[(FieldDeclaration) $1]
|
|
[(MethodDeclaration) $1])
|
|
|
|
;; 19.8.2
|
|
(FieldDeclaration
|
|
[(Modifiers Type VariableDeclarators SEMI_COLON)
|
|
(map (lambda (d) (build-field-decl $1 $2 d)) (reverse $3))]
|
|
[(Type VariableDeclarators SEMI_COLON)
|
|
(map (lambda (d) (build-field-decl null $1 d)) (reverse $2))])
|
|
|
|
(VariableDeclarators
|
|
[(VariableDeclarator) (list $1)]
|
|
[(VariableDeclarators COMMA VariableDeclarator) (cons $3 $1)])
|
|
|
|
(VariableDeclarator
|
|
[(VariableDeclaratorId) $1]
|
|
[(VariableDeclaratorId = VariableInitializer)
|
|
(make-var-init $1 $3 (build-src 3))])
|
|
|
|
(VariableDeclaratorId
|
|
[(IDENTIFIER)
|
|
(make-var-decl (make-id $1 (build-src 1)) null (make-type-spec #f 0 (build-src 1)) #f (build-src 1))]
|
|
[(IDENTIFIER Dims)
|
|
(make-var-decl (make-id $1 (build-src 1)) null (make-type-spec #f $2 (build-src 2)) #f (build-src 2))])
|
|
|
|
(VariableInitializer
|
|
[(Expression) $1]
|
|
[(ArrayInitializer) $1])
|
|
|
|
;; 19.8.3
|
|
(MethodDeclaration
|
|
[(MethodHeader MethodBody) (make-method (method-modifiers $1)
|
|
(method-type $1)
|
|
(method-type-parms $1)
|
|
(method-name $1)
|
|
(method-parms $1)
|
|
(method-throws $1)
|
|
$2
|
|
#f
|
|
#f
|
|
(build-src 2))])
|
|
|
|
(MethodHeader
|
|
[(Modifiers Type MethodDeclarator) (construct-method-header $1 null $2 $3 null)]
|
|
[(Modifiers void MethodDeclarator)
|
|
(construct-method-header $1
|
|
null
|
|
(make-type-spec 'void 0 (build-src 2 2))
|
|
$3
|
|
null)]
|
|
[(Type MethodDeclarator) (construct-method-header null null $1 $2 null)]
|
|
[(void MethodDeclarator)
|
|
(construct-method-header null
|
|
null
|
|
(make-type-spec 'void 0 (build-src 2 2))
|
|
$2
|
|
null)])
|
|
|
|
(MethodDeclarator
|
|
[(IDENTIFIER O_PAREN FormalParameterList C_PAREN) (list (make-id $1 (build-src 1)) (reverse $3) 0)]
|
|
[(IDENTIFIER O_PAREN C_PAREN) (list (make-id $1 (build-src 1)) null 0)]
|
|
[(IDENTIFIER O_PAREN FormalParameterList C_PAREN Dims) (list (make-id $1 (build-src 1)) (reverse $3) $5)]
|
|
[(IDENTIFIER O_PAREN C_PAREN Dims) (list (make-id $1 (build-src 1)) null $4)])
|
|
|
|
(FormalParameterList
|
|
[(FormalParameter) (list $1)]
|
|
[(FormalParameterList COMMA FormalParameter) (cons $3 $1)])
|
|
|
|
(FormalParameter
|
|
[(Type VariableDeclaratorId) (build-field-decl null $1 $2)])
|
|
|
|
(MethodBody
|
|
[(Block) $1]
|
|
[(SEMI_COLON) #f])
|
|
|
|
;; 19.8.4
|
|
|
|
(StaticInitializer
|
|
;; 1.1
|
|
[(Block) (make-initialize #f $1 (build-src 1))])
|
|
|
|
;; 19.8.5
|
|
|
|
(ConstructorDeclaration
|
|
[(Modifiers ConstructorDeclarator ConstructorBody)
|
|
(make-method $1 (make-type-spec 'ctor 0 (build-src 3)) null (car $2)
|
|
(cadr $2) null $3 #f #f (build-src 3))]
|
|
[(ConstructorDeclarator ConstructorBody)
|
|
(make-method null (make-type-spec 'ctor 0 (build-src 2)) null (car $1)
|
|
(cadr $1) null $2 #f #f (build-src 2))])
|
|
|
|
(ConstructorDeclarator
|
|
[(IDENTIFIER O_PAREN FormalParameterList C_PAREN) (list (make-id $1 (build-src 1)) (reverse $3))]
|
|
[(IDENTIFIER O_PAREN C_PAREN) (list (make-id $1 (build-src 1)) null)])
|
|
|
|
(ConstructorBody
|
|
[(O_BRACE ExplicitConstructorInvocation BlockStatements C_BRACE)
|
|
(make-block (cons $2 (reverse $3)) (build-src 4))]
|
|
[(O_BRACE ExplicitConstructorInvocation C_BRACE)
|
|
(make-block (list $2) (build-src 3))]
|
|
[(O_BRACE BlockStatements C_BRACE)
|
|
(make-block
|
|
(cons (make-call #f #f #f (make-special-name #f #f "super") null #f)
|
|
(reverse $2))
|
|
(build-src 3))]
|
|
[(O_BRACE C_BRACE)
|
|
(make-block
|
|
(list (make-call #f (build-src 1)
|
|
#f (make-special-name #f #f "super") null (build-src 2)))
|
|
(build-src 2))])
|
|
|
|
(ExplicitConstructorInvocation
|
|
[(this O_PAREN ArgumentList C_PAREN SEMI_COLON)
|
|
(make-call #f (build-src 5)
|
|
#f (make-special-name #f (build-src 1) "this") (reverse $3) #f)]
|
|
[(this O_PAREN C_PAREN SEMI_COLON)
|
|
(make-call #f (build-src 4)
|
|
#f (make-special-name #f (build-src 1) "this") null #f)]
|
|
[(super O_PAREN ArgumentList C_PAREN SEMI_COLON)
|
|
(make-call #f (build-src 5)
|
|
#f (make-special-name #f (build-src 1) "super") (reverse $3) #f)]
|
|
[(super O_PAREN C_PAREN SEMI_COLON)
|
|
(make-call #f (build-src 4)
|
|
#f (make-special-name #f (build-src 1) "super") null #f)])
|
|
|
|
;; 19.9.1
|
|
|
|
(InterfaceDeclaration
|
|
[(Modifiers interface IDENTIFIER ExtendsInterfaces InterfaceBody)
|
|
(make-interface-def (make-header (make-id $3 (build-src 3 3)) $1 $4 null null (build-src 4))
|
|
$5
|
|
(build-src 2 2)
|
|
(build-src 5)
|
|
(file-path)
|
|
'advanced
|
|
null 'top null)]
|
|
[(Modifiers interface IDENTIFIER InterfaceBody)
|
|
(make-interface-def (make-header (make-id $3 (build-src 3 3)) $1 null null null (build-src 3))
|
|
$4
|
|
(build-src 2 2)
|
|
(build-src 4)
|
|
(file-path)
|
|
'advanced
|
|
null 'top null)]
|
|
[(interface IDENTIFIER ExtendsInterfaces InterfaceBody)
|
|
(make-interface-def (make-header (make-id $2 (build-src 2 2)) null $3 null null (build-src 3))
|
|
$4
|
|
(build-src 1)
|
|
(build-src 4)
|
|
(file-path)
|
|
'advanced
|
|
null 'top null)]
|
|
[(interface IDENTIFIER InterfaceBody)
|
|
(make-interface-def (make-header (make-id $2 (build-src 2 2)) null null null null (build-src 2))
|
|
$3
|
|
(build-src 1)
|
|
(build-src 3)
|
|
(file-path)
|
|
'advanced
|
|
null 'top null)])
|
|
|
|
|
|
(ExtendsInterfaces
|
|
[(extends InterfaceType) (list $2)]
|
|
[(ExtendsInterfaces COMMA InterfaceType) (cons $3 $1)])
|
|
|
|
(InterfaceBody
|
|
[(O_BRACE InterfaceMemberDeclarations C_BRACE) $2])
|
|
|
|
(InterfaceMemberDeclarations
|
|
[() null]
|
|
[(InterfaceMemberDeclarations InterfaceMemberDeclaration)
|
|
(cond
|
|
((not $2) $1)
|
|
((list? $2) (append $2 $1))
|
|
(else (cons $2 $1)))])
|
|
|
|
(InterfaceMemberDeclaration
|
|
[(ConstantDeclaration) $1]
|
|
[(AbstractMethodDeclaration) $1]
|
|
[(SEMI_COLON) #f])
|
|
|
|
(ConstantDeclaration
|
|
[(FieldDeclaration) $1])
|
|
|
|
(AbstractMethodDeclaration
|
|
[(MethodHeader SEMI_COLON) $1])
|
|
|
|
;; 19.10
|
|
|
|
(ArrayInitializer
|
|
[(O_BRACE VariableInitializers COMMA C_BRACE) (make-array-init $2 (build-src 3))]
|
|
[(O_BRACE VariableInitializers C_BRACE) (make-array-init $2 (build-src 3))]
|
|
[(O_BRACE COMMA C_BRACE) (make-array-init null (build-src 3))]
|
|
[(O_BRACE C_BRACE) (make-array-init null (build-src 2))])
|
|
|
|
(VariableInitializers
|
|
[(VariableInitializer) (list $1)]
|
|
[(VariableInitializers COMMA VariableInitializer) (cons $3 $1)])
|
|
|
|
;; 19.11
|
|
|
|
(Block
|
|
[(O_BRACE BlockStatements C_BRACE) (make-block (reverse $2) (build-src 3))]
|
|
[(O_BRACE C_BRACE) (make-block null (build-src 2))])
|
|
|
|
(BlockStatements
|
|
[(BlockStatement) (cond
|
|
((list? $1) $1)
|
|
(else (list $1)))]
|
|
[(BlockStatements BlockStatement) (cond
|
|
((list? $2)
|
|
(append (reverse $2) $1))
|
|
(else
|
|
(cons $2 $1)))])
|
|
|
|
(BlockStatement
|
|
[(LocalVariableDeclarationStatement) $1]
|
|
[(Statement) $1])
|
|
|
|
(LocalVariableDeclarationStatement
|
|
[(LocalVariableDeclaration SEMI_COLON) $1])
|
|
|
|
(LocalVariableDeclaration
|
|
[(Type VariableDeclarators)
|
|
(map (lambda (d) (build-field-decl null $1 d)) (reverse $2))])
|
|
|
|
(Statement
|
|
[(StatementWithoutTrailingSubstatement) $1]
|
|
[(IfThenStatement) $1]
|
|
[(IfThenElseStatement) $1]
|
|
[(WhileStatement) $1]
|
|
[(ForStatement) $1])
|
|
|
|
(StatementNoShortIf
|
|
[(StatementWithoutTrailingSubstatement) $1]
|
|
[(IfThenElseStatementNoShortIf) $1]
|
|
[(WhileStatementNoShortIf) $1]
|
|
[(ForStatementNoShortIf) $1])
|
|
|
|
(StatementWithoutTrailingSubstatement
|
|
[(Block) $1]
|
|
[(EmptyStatement) $1]
|
|
[(Assignment SEMI_COLON) $1]
|
|
[(ExpressionStatement) $1]
|
|
[(DoStatement) $1]
|
|
[(BreakStatement) $1]
|
|
[(ContinueStatement) $1]
|
|
[(ReturnStatement) $1])
|
|
|
|
(EmptyStatement
|
|
[(SEMI_COLON) (make-block null (build-src 1))])
|
|
|
|
(ExpressionStatement
|
|
[(StatementExpression SEMI_COLON) $1])
|
|
|
|
(StatementExpression
|
|
[(PreIncrementExpression) $1]
|
|
[(PreDecrementExpression) $1]
|
|
[(PostIncrementExpression) $1]
|
|
[(PostDecrementExpression) $1]
|
|
[(MethodInvocation) $1]
|
|
[(ClassInstanceCreationExpression) $1])
|
|
|
|
(IfThenStatement
|
|
[(if O_PAREN Expression C_PAREN Statement) (make-ifS $3 $5 #f (build-src 1) (build-src 5))])
|
|
|
|
(IfThenElseStatement
|
|
[(if O_PAREN Expression C_PAREN StatementNoShortIf else Statement)
|
|
(make-ifS $3 $5 $7 (build-src 1) (build-src 7))])
|
|
|
|
(IfThenElseStatementNoShortIf
|
|
[(if O_PAREN Expression C_PAREN StatementNoShortIf else StatementNoShortIf)
|
|
(make-ifS $3 $5 $7 (build-src 1) (build-src 7))])
|
|
|
|
(WhileStatement
|
|
[(while O_PAREN Expression C_PAREN Statement)
|
|
(make-while $3 $5 (build-src 5))])
|
|
|
|
(WhileStatementNoShortIf
|
|
[(while O_PAREN Expression C_PAREN StatementNoShortIf)
|
|
(make-while $3 $5 (build-src 5))])
|
|
|
|
(DoStatement
|
|
[(do Statement while O_PAREN Expression C_PAREN SEMI_COLON)
|
|
(make-doS $2 $5 (build-src 7))])
|
|
|
|
(ForStatement
|
|
[(for O_PAREN ForInit SEMI_COLON Expression SEMI_COLON ForUpdate C_PAREN Statement)
|
|
(make-for $3 $5 $7 $9 (build-src 9))]
|
|
[(for O_PAREN ForInit SEMI_COLON SEMI_COLON ForUpdate C_PAREN Statement)
|
|
(make-for $3
|
|
(make-literal 'boolean (build-src 4 5) #t)
|
|
$6
|
|
$8
|
|
(build-src 8))])
|
|
|
|
|
|
(ForStatementNoShortIf
|
|
[(for O_PAREN ForInit SEMI_COLON Expression SEMI_COLON ForUpdate C_PAREN StatementNoShortIf)
|
|
(make-for $3 $5 $7 $9 (build-src 9))]
|
|
[(for O_PAREN ForInit SEMI_COLON SEMI_COLON ForUpdate C_PAREN StatementNoShortIf)
|
|
(make-for $3 (make-literal 'boolean #t (build-src 4 5))
|
|
$6 $8 (build-src 8))])
|
|
(ForInit
|
|
[() null]
|
|
[(StatementExpressionList) (reverse $1)]
|
|
[(LocalVariableDeclaration) (reverse $1)])
|
|
|
|
(ForUpdate
|
|
[() null]
|
|
[(StatementExpressionList) (reverse $1)])
|
|
|
|
(StatementExpressionList
|
|
[(StatementExpression) (list $1)]
|
|
[(StatementExpressionList COMMA StatementExpression) (cons $3 $1)])
|
|
|
|
(BreakStatement
|
|
[(break SEMI_COLON) (make-break #f (build-src 2))])
|
|
|
|
(ContinueStatement
|
|
[(continue SEMI_COLON) (make-continue #f (build-src 2))])
|
|
|
|
(ReturnStatement
|
|
[(return Expression SEMI_COLON) (make-return $2 #f (build-src 3))]
|
|
[(return SEMI_COLON) (make-return #f #f (build-src 2))])
|
|
|
|
;; 19.12
|
|
|
|
(Primary
|
|
[(PrimaryNoNewArray) $1]
|
|
[(ArrayCreationExpression) $1])
|
|
|
|
(PrimaryNoNewArray
|
|
[(Literal) $1]
|
|
[(this) (make-special-name #f (build-src 1) "this")]
|
|
[(O_PAREN Expression C_PAREN) $2]
|
|
[(ClassInstanceCreationExpression) $1]
|
|
[(FieldAccess) $1]
|
|
[(MethodInvocation) $1]
|
|
[(ArrayAccess) $1])
|
|
|
|
(ClassInstanceCreationExpression
|
|
[(new ClassOrInterfaceType O_PAREN ArgumentList C_PAREN)
|
|
(make-class-alloc #f (build-src 5) $2 (reverse $4) #f #f #f)]
|
|
[(new ClassOrInterfaceType O_PAREN C_PAREN)
|
|
(make-class-alloc #f (build-src 4) $2 null #f #f #f)])
|
|
|
|
(ArgumentList
|
|
[(Expression) (list $1)]
|
|
[(ArgumentList COMMA Expression) (cons $3 $1)])
|
|
|
|
(ArrayCreationExpression
|
|
[(new PrimitiveType DimExprs Dims) (make-array-alloc #f (build-src 4) $2 (reverse $3) $4)]
|
|
[(new PrimitiveType DimExprs) (make-array-alloc #f (build-src 3) $2 (reverse $3) 0)]
|
|
[(new ClassOrInterfaceType DimExprs Dims)
|
|
(make-array-alloc #f (build-src 4) (make-type-spec $2 0 (build-src 2 2)) (reverse $3) $4)]
|
|
[(new ClassOrInterfaceType DimExprs)
|
|
(make-array-alloc #f (build-src 3) (make-type-spec $2 0 (build-src 2 2)) (reverse $3) 0)]
|
|
;; 1.1
|
|
[(new PrimitiveType Dims ArrayInitializer)
|
|
(begin (display $2)
|
|
(error 'unimplemented-1.1))]
|
|
;; 1.1
|
|
[(new ClassOrInterfaceType Dims ArrayInitializer) (error 'unimplemented-1.1)])
|
|
|
|
(DimExprs
|
|
[(DimExpr) (list $1)]
|
|
[(DimExprs DimExpr) (cons $2 $1)])
|
|
|
|
(DimExpr
|
|
[(O_BRACKET Expression C_BRACKET) $2])
|
|
|
|
(Dims
|
|
[(O_BRACKET C_BRACKET) 1]
|
|
[(Dims O_BRACKET C_BRACKET) (add1 $1)])
|
|
|
|
(FieldAccess
|
|
[(Primary PERIOD IDENTIFIER)
|
|
(make-access #f (build-src 3) (make-field-access $1
|
|
(make-id $3 (build-src 3 3)) #f))]
|
|
[(super PERIOD IDENTIFIER)
|
|
(make-access #f (build-src 3)
|
|
(make-field-access (make-special-name #f (build-src 1)
|
|
"super")
|
|
(make-id $3 (build-src 3 3))
|
|
#f))])
|
|
|
|
(MethodInvocation
|
|
[(Name O_PAREN ArgumentList C_PAREN) (build-name-call $1 (reverse $3) (build-src 4))]
|
|
[(Name O_PAREN C_PAREN) (build-name-call $1 null (build-src 3))]
|
|
[(Primary PERIOD IDENTIFIER O_PAREN ArgumentList C_PAREN)
|
|
(make-call #f (build-src 6) $1 (make-id $3 (build-src 3 3)) (reverse $5) #f)]
|
|
[(Primary PERIOD IDENTIFIER O_PAREN C_PAREN)
|
|
(make-call #f (build-src 5) $1 (make-id $3 (build-src 3 3)) null #f)]
|
|
[(super PERIOD IDENTIFIER O_PAREN ArgumentList C_PAREN)
|
|
(make-call #f (build-src 6)
|
|
(make-special-name #f (build-src 1) "super")
|
|
(make-id $3 (build-src 3 3)) (reverse $5) #f)]
|
|
[(super PERIOD IDENTIFIER O_PAREN C_PAREN)
|
|
(make-call #f (build-src 5)
|
|
(make-special-name #f (build-src 1) "super")
|
|
(make-id $3 (build-src 3 3)) null #f)])
|
|
|
|
(ArrayAccess
|
|
[(Name O_BRACKET Expression C_BRACKET)
|
|
(make-array-access #f (build-src 4) (name->access $1) $3)]
|
|
[(PrimaryNoNewArray O_BRACKET Expression C_BRACKET)
|
|
(make-array-access #f (build-src 4) $1 $3)])
|
|
|
|
(PostfixExpression
|
|
[(Primary) $1]
|
|
[(Name) (name->access $1)]
|
|
[(PostIncrementExpression) $1]
|
|
[(PostDecrementExpression) $1])
|
|
|
|
(PostIncrementExpression
|
|
[(PostfixExpression ++) (make-post-expr #f (build-src 2) $1 '++ (build-src 2 2))])
|
|
|
|
(PostDecrementExpression
|
|
[(PostfixExpression --) (make-post-expr #f (build-src 2) $1 '-- (build-src 2 2))])
|
|
|
|
(UnaryExpression
|
|
[(PreIncrementExpression) $1]
|
|
[(PreDecrementExpression) $1]
|
|
[(+ UnaryExpression) (make-unary #f (build-src 2) '+ $2 (build-src 1))]
|
|
[(- UnaryExpression) (make-unary #f (build-src 2) '- $2 (build-src 1))]
|
|
[(UnaryExpressionNotPlusMinus) $1])
|
|
|
|
(PreIncrementExpression
|
|
[(++ UnaryExpression) (make-pre-expr #f (build-src 2) '++ $2 (build-src 1))])
|
|
|
|
(PreDecrementExpression
|
|
[(-- UnaryExpression) (make-pre-expr #f (build-src 2) '-- $2 (build-src 1))])
|
|
|
|
(UnaryExpressionNotPlusMinus
|
|
[(PostfixExpression) $1]
|
|
[(~ UnaryExpression) (make-unary #f (build-src 2) '~ $2 (build-src 1))]
|
|
[(! UnaryExpression) (make-unary #f (build-src 2) '! $2 (build-src 1))]
|
|
[(CastExpression) $1])
|
|
|
|
(CastExpression
|
|
[(O_PAREN PrimitiveType Dims C_PAREN UnaryExpression)
|
|
(make-cast #f (build-src 5)
|
|
(make-type-spec (type-spec-name $2)
|
|
$3
|
|
(build-src 2 3))
|
|
$5)]
|
|
[(O_PAREN PrimitiveType C_PAREN UnaryExpression)
|
|
(make-cast #f (build-src 4) $2 $4)]
|
|
[(O_PAREN Expression C_PAREN UnaryExpressionNotPlusMinus)
|
|
(if (access? $2)
|
|
(make-cast #f (build-src 4)
|
|
(make-type-spec (access->name $2) 0 (build-src 2 2)) $4)
|
|
(error 'bad-cast))]
|
|
;; GJ - Not sure if this is in spec or not.
|
|
;;[(O_PAREN Name < ReferenceTypeList1 C_PAREN UnaryExpressionNotPlusMinus) #t]
|
|
[(O_PAREN Name Dims C_PAREN UnaryExpressionNotPlusMinus)
|
|
(make-cast #f (build-src 4)
|
|
(make-type-spec $2 $3 (build-src 2 3))
|
|
$5)])
|
|
|
|
(MultiplicativeExpression
|
|
[(UnaryExpression) $1]
|
|
[(MultiplicativeExpression * UnaryExpression)
|
|
(make-bin-op #f (build-src 3) '* $1 $3 (build-src 2 2))]
|
|
[(MultiplicativeExpression / UnaryExpression)
|
|
(make-bin-op #f (build-src 3) '/ $1 $3 (build-src 2 2))]
|
|
[(MultiplicativeExpression % UnaryExpression)
|
|
(make-bin-op #f (build-src 3) '% $1 $3 (build-src 2 2))])
|
|
|
|
(AdditiveExpression
|
|
[(MultiplicativeExpression) $1]
|
|
[(AdditiveExpression + MultiplicativeExpression)
|
|
(make-bin-op #f (build-src 3) '+ $1 $3 (build-src 2 2))]
|
|
[(AdditiveExpression - MultiplicativeExpression)
|
|
(make-bin-op #f (build-src 3) '- $1 $3 (build-src 2 2))])
|
|
|
|
(ShiftExpression
|
|
[(AdditiveExpression) $1]
|
|
[(ShiftExpression << AdditiveExpression)
|
|
(make-bin-op #f (build-src 3) '<< $1 $3 (build-src 2 2))]
|
|
[(ShiftExpression >> AdditiveExpression)
|
|
(make-bin-op #f (build-src 3) '>> $1 $3 (build-src 2 2))]
|
|
[(ShiftExpression >>> AdditiveExpression)
|
|
(make-bin-op #f (build-src 3) '>>> $1 $3 (build-src 2 2))])
|
|
|
|
|
|
(RelationalExpression
|
|
[(ShiftExpression) $1]
|
|
;; GJ - changed to remove shift/reduce conflict
|
|
[(ShiftExpression < ShiftExpression)
|
|
(make-bin-op #f (build-src 3) '< $1 $3 (build-src 2 2))]
|
|
[(RelationalExpression > ShiftExpression)
|
|
(make-bin-op #f (build-src 3) '> $1 $3 (build-src 2 2))]
|
|
[(RelationalExpression <= ShiftExpression)
|
|
(make-bin-op #f (build-src 3) '<= $1 $3 (build-src 2 2))]
|
|
[(RelationalExpression >= ShiftExpression)
|
|
(make-bin-op #f (build-src 3) '>= $1 $3 (build-src 2 2))]
|
|
[(RelationalExpression instanceof ReferenceType)
|
|
(make-instanceof #f (build-src 3) $1 $3 (build-src 2 2))])
|
|
|
|
|
|
(EqualityExpression
|
|
[(RelationalExpression) $1]
|
|
[(EqualityExpression == RelationalExpression)
|
|
(make-bin-op #f (build-src 3) '== $1 $3 (build-src 2 2))]
|
|
[(EqualityExpression != RelationalExpression)
|
|
(make-bin-op #f (build-src 3) '!= $1 $3 (build-src 2 2))])
|
|
|
|
(AndExpression
|
|
[(EqualityExpression) $1]
|
|
[(AndExpression & EqualityExpression)
|
|
(make-bin-op #f (build-src 3) '& $1 $3 (build-src 2 2))])
|
|
|
|
|
|
(ExclusiveOrExpression
|
|
[(AndExpression) $1]
|
|
[(ExclusiveOrExpression ^ AndExpression)
|
|
(make-bin-op #f (build-src 3) '^ $1 $3 (build-src 2 2))])
|
|
|
|
|
|
(InclusiveOrExpression
|
|
[(ExclusiveOrExpression) $1]
|
|
[(InclusiveOrExpression PIPE ExclusiveOrExpression)
|
|
(make-bin-op #f (build-src 3) 'or $1 $3 (build-src 2 2))])
|
|
|
|
(ConditionalAndExpression
|
|
[(InclusiveOrExpression) $1]
|
|
[(ConditionalAndExpression && InclusiveOrExpression)
|
|
(make-bin-op #f (build-src 3) '&& $1 $3 (build-src 2 2))])
|
|
|
|
(ConditionalOrExpression
|
|
[(ConditionalAndExpression) $1]
|
|
[(ConditionalOrExpression OR ConditionalAndExpression)
|
|
(make-bin-op #f (build-src 3) 'oror $1 $3 (build-src 2 2))])
|
|
|
|
(ConditionalExpression
|
|
[(ConditionalOrExpression) $1]
|
|
[(ConditionalOrExpression ? Expression : ConditionalExpression)
|
|
(make-cond-expression #f (build-src 5) $1 $3 $5 (build-src 2 2))])
|
|
|
|
(AssignmentExpression
|
|
[(ConditionalExpression) $1])
|
|
|
|
(Assignment
|
|
[(LeftHandSide AssignmentOperator AssignmentExpression)
|
|
(make-assignment #f (build-src 3) $1 $2 $3 (build-src 2 2))])
|
|
|
|
(LeftHandSide
|
|
[(Name) (name->access $1)]
|
|
[(FieldAccess) $1]
|
|
[(ArrayAccess) $1])
|
|
|
|
(AssignmentOperator
|
|
[(=) '=]
|
|
[(*=) '*=]
|
|
[(/=) '/=]
|
|
[(%=) '%=]
|
|
[(+=) '+=]
|
|
[(-=) '-=]
|
|
[(<<=) '<<=]
|
|
[(>>=) '>>=]
|
|
[(>>>=) '>>>=]
|
|
[(&=) '&=]
|
|
[(^=) '^=]
|
|
[(OREQUAL) 'or=])
|
|
|
|
(Expression
|
|
[(AssignmentExpression) $1])
|
|
|
|
(ConstantExpression
|
|
[(Expression) $1]))))
|
|
|
|
;(define advanced-grammar (cadr parsers))
|
|
;(set! parsers (car parsers))
|
|
|
|
(define parse-advanced (car parsers))
|
|
(define parse-advanced-interactions (cadr parsers))
|
|
(define parse-advanced-expression (caddr parsers))
|
|
(define parse-advanced-type (cadddr parsers))
|
|
)
|