[antlr-interest] BETA Grammar
Kyle Robson
kyledr at gmail.com
Tue Feb 2 14:37:39 PST 2010
Hi all, I have a grammar here that is giving me a null pointer
exception when I try to use the ANTLR tool on it. It's too large, and
there's so much going on, that I don't know where to begin debugging
it. I assume I may have some common problem that I need to fix
throughout.
The grammar is based off the book here:
http://www.daimi.au.dk/~beta/Books/index.html#betabook_download
My (very straightforward) implementation of it is here:
http://paste-it.net/public/qac33be/
Here's the full text in case that link dies:
grammar Beta;
options {
output=AST;
ASTLabelType=CommonTree; // type of $stat.tree ref etc...
}
//BetaForm: ( stat {System.out.println($stat.tree.toStringTree());} )+ ;
Beta: ( BetaForm {System.out.println($BetaForm.tree.toStringTree());} )+ ;
BetaForm: DescriptorForm
| AttributesForm
;
DescriptorForm
: ObjectDescriptor
;
AttributesForm
: Attributes
;
ObjectDescriptor
: SuperPatternOpt MainPart
;
MainPart: '(#' Attributes ActionPart '#)'
;
Attributes
: (AttributeDeclOpt)+
;
SuperPatternOpt
: (SuperPattern)?
;
SuperPattern
: AttributeDenotation
;
AttributeDeclOpt: (AttributeDecl)?
;
AttributeDecl
: PatternDecl
| SimpleDecl
| RepetitionDecl
;
PatternDecl
: Names ':' ObjectDescriptor -> Names ':' ObjectDescriptor
;
SimpleDecl
: Names ':' ReferenceSpecification -> Names ':' ReferenceSpecification
;
RepetitionDecl
: Names ':' '[' Index ']' ReferenceSpecification
;
ReferenceSpecification
: StaticItem
| DynamicItem
| StaticComponent
| DynamicComponent
;
StaticItem
: '@' ObjectSpecification -> '@' ObjectSpecification
;
DynamicItem
: '^' AttributeDenotation
;
StaticComponent
: '@'
| ObjectSpecification
;
DynamicComponent
: '^'
| AttributeDenotation
;
ObjectSpecification
: ObjectDescriptor
| AttributeDenotation
;
Index : SimpleIndex
| NamedIndex
;
NamedIndex
: NameDcl ':' Evaluation
;
ActionPart
: EnterPartOpt DoPartOpt ExitPartOpt
;
EnterPartOpt
: (EnterPart)?
;
EnterPart
: 'enter' Evaluation
;
DoPartOpt
: (DoPart)?
;
DoPart : 'do' Imperatives
;
ExitPartOpt
: (ExitPart)?
;
ExitPart: 'exit' Evaluation;
Imperatives
: (ImpOpt ';')+
;
ImpOpt : (Imp)?
;
Imp : LabelledImp
| LabelledCompoundImp
| ForImp
| IfImp
| LeaveImp
| RestartImp
| InnerImp
| SuspendImp
| Evaluation
;
LabelledImp
: NameDcl ':' Imp
;
LabelledCompoundImp
: '(' NameDcl Imperatives NameDcl ')'
;
ForImp : '(for' Index 'repeat' Imperatives 'for)'
;
IfImp : '(if' Evaluation Alternatives ElsePartOpt 'if)'
;
Alternatives
: (Alternative)+
;
Alternative
: Selections 'then' Imperatives
;
Selections
: Selection
;
Selection
: CaseSelection
;
CaseSelection
: '//' Evaluation
;
ElsePartOpt
: (ElsePart)?
;
ElsePart: 'else' Imperatives
;
LeaveImp: 'leave' NameApl
;
RestartImp
: 'restart' NameApl
;
InnerImp: 'inner' NameAplOpt
;
NameAplOpt
: (NameApl)?
;
SuspendImp
: 'suspend'
;
Evaluations
: (Evaluation ',')+
;
Evaluation
: Expression
| AssignmentEvaluation
;
AssignmentEvaluation
: Evaluation '->' Transaction
;
Transaction
: ObjectEvaluation
| ComputedObjectEvaluation
| ObjectReference
| EvalList
| StructureReference
;
ObjectEvaluation
: InsertedItem
| Reference
;
Reference
: ObjectDenotation
| DynamicObjectGeneration
;
DynamicObjectGeneration
: DynamicItemGeneration
| DynamicComponentGeneration
;
InsertedItem
: ObjectDescriptor
;
ObjectDenotation
: AttributeDenotation
;
ComputedObjectEvaluation
: ObjectEvaluation '!'
;
ObjectReference
: Reference '[]'
;
StructureReference
: AttributeDenotation '##'
;
EvalList: '(' Evaluations ')'
;
DynamicItemGeneration
: '&' ObjectSpecification
;
DynamicComponentGeneration
: '&' | ObjectSpecification;
AttributeDenotation
: NameApl
| Remote
| ComputedRemote
| Indexed
| ThisObject
;
Remote : AttributeDenotation '.' NameApl
;
ComputedRemote
: '(' Evaluations ')' '.' NameApl
;
Indexed : AttributeDenotation '[' Evaluation ']'
;
ThisObject
: 'this' '(' NameApl ')'
;
Expression
: RelationalExpr
| SimpleExp
;
RelationalExpr
: EqExp
| LtExp
| LeExp
| GtExp
| GeExp
| NeExp
;
SimpleExp
: AddExp
| SignedTerm
| Term
;
AddExp : PlusExp
| MinusExp
| OrExp
;
SignedTerm
: UnaryPlusExp
| UnaryMinusExp
;
Term : MulExp
| Factor
;
MulExp : TimesExp
| DivExp
| ModExp
| AndExp
;
EqExp : SimpleExp '=' SimpleExp;
LtExp : SimpleExp '<' SimpleExp;
LeExp : SimpleExp '<=' SimpleExp;
GtExp : SimpleExp '>' SimpleExp;
GeExp : SimpleExp '>=' SimpleExp;
NeExp : SimpleExp '<>' SimpleExp;
PlusExp : SimpleExp '+' Term;
MinusExp: SimpleExp '-' Term;
OrExp : SimpleExp 'or' Term;
UnaryPlusExp
: '+' Term;
UnaryMinusExp
: '-' Term;
TimesExp: Term '*' Factor;
DivExp : Term 'div' Factor;
ModExp : Term 'mod' Factor;
AndExp : Term 'and' Factor;
Factor : TextConst
| IntegerConst
| NotExp
| NoneExp
| RepetitionSlice
| Transaction
;
RepetitionSlice
: AttributeDenotation '[' Evaluation ':' Evaluation ']'
;
NotExp : 'not' Factor;
NoneExp : 'none';
Names : (NameDcl)+;
NameDcl : NameDecl;
NameApl : NameAppl;
SimpleEntry
: (TextConst)?
;
TextConst
: String
;
IntegerConst
: Int
;
SimpleIndex
: Evaluation
;
NameAppl: NameDecl;
NameDecl: (Letter|'_')+(Digit|Letter|'_')*
;
String : '\''Char*'\''
;
// where <char> can be any char except "'" and newline.
// "'" are allowed in <String>, iff preceeded with "\".
// "\n", "\t", etc. are allowed in <String> to
// represent non-printable chars - see Compiler
// manual (mia91-02) for details.
Const : (Int|Based)//|Real)
;
// where
Int : (Digit)+
;
Based : Int('X'|'x')BasedNum
;
BasedNum: (Digit|Letter)+
;
//Real : Int['.' Int][('E'|'e')[('+'|'-')]Int]
// ;
Letter : 'a'..'z'|'A'..'Z'
;
Digit : '0'..'9'
;
Char : '0'..'9'|'a'..'z'|'A'..'Z'|'!'|'@'|'#'|'$'|'%'|'^'|'&'|'*'|'('|')'|'-'|'='|'_'|'+'|'['|']'|'{'|'}'|'|'|'\\'|';'|':'|'\''|'<'|'>'|','|'.'|'/'|'?'
;
WS : (' '|'\t'|'\r'|'\n')+ {skip();} ;
Sincere thanks for any tips,
Kyle
More information about the antlr-interest
mailing list