Can't get scoping to work [message #1727780] |
Sun, 27 March 2016 10:16  |
Eclipse User |
|
|
|
I want to achieve this:
int x ;
{
x = 10; //right
int a = 10;
a = x; //right
}
a = 10; // wrong
int b = a; // wrong
This is my grammar:
grammar org.xtext.Cbb with org.eclipse.xtext.common.Terminals
generate cbb "http://www.xtext.org/Cbb"
Module:
(statements+=Statement)*;
Statement:
Variable |
Block |
IfStatement |
WhileStatement |
DoWhileStatement |
ForStatement |
SwitchStatement;
IfStatement:
'if' '(' condition=Expression ')'
thenBlock=Block
('else' 'if' '(' elseifConditions+=Expression ')'
elseifthenBlocks+=Block)*
(=>'else' elseBlock=Block)?;
WhileStatement:
'while' '(' condition= Expression ')'
whileBlock=Block;
DoWhileStatement:
'do'
doWhileBlock=Block
'while' '(' condition=Expression ')'';';
ForStatement:
'for''('((init=Variable)|(';'))(condition=Expression)?';'(increment=Expression)?')'
forBlock=Block;
SwitchStatement:
'switch' '('expr=Expression')'
'{'
('case' values+=integer_value ':'
(caseStatements+=Statement)*
('break'';')?
)*
('default'':'
(defaultStatements+=Statement)*
)?
'}';
Block:
{Block} '{' (blockStatements+=Statement)* '}';
Variable:
VariableDeclaration | VariableAssignment;
VariableDeclaration:
type=Type name=ID (op='=' expr=Expression)?';' |
'const' type=Type name=ID op='=' expr=Expression';';
VariableAssignment:
assignee=[VariableDeclaration] op=assignment_operator expr=Expression';';
Expression returns Expression:
BooleanExpression;
BooleanExpression returns Expression:
Comparison
({Expression.left=current} op=BooleanOperator right=Comparison)*;
Comparison returns Expression:
Equal
({Expression.left=current} op=ComparisonOperator right=Equal)*;
Equal returns Expression:
Addition
({Expression.left=current} op=EqualityOperator right=Addition)*;
Addition returns Expression:
Multiplication
({Expression.left=current} op=AdditionOperator right=Multiplication)*;
Multiplication returns Expression:
Bitwise
({Expression.left=current} op=MultiplicationOperator right=Bitwise)*;
Bitwise returns Expression:
Prefixed
({Expression.left=current} op=BitwiseOperator right=Prefixed)*;
Prefixed returns Expression:
{BooleanNegation} =>"!" expression=Atomic |
{BitwiseNot} =>"~" expression=Atomic |
Atomic;
Atomic returns Expression:
lp='(' expr=Expression rp=')' |
{IntegerLiteral} value=integer_value |
{BooleanLiteral} value=boolean_value |
{IntegerIncrementDecrement} (increment_decrement_operator ref=[VariableDeclaration]|ref=[VariableDeclaration] increment_decrement_operator) |
{VariableReference} ref=[VariableDeclaration];
Type:
{IntegerType} 'int' |
{BooleanType} 'bool';
AdditionOperator:
'+' | '-';
MultiplicationOperator:
'*' | '/' | '%';
BitwiseOperator:
'|' | '&' | '^' | '>>' | '<<';
ComparisonOperator:
'<' | '<=' | '>' | '>=';
EqualityOperator:
'==' | '!=';
BooleanOperator:
'||' | '&&';
boolean_value:
'true' | 'false';
assignment_operator:
'=' | '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^=' | '<<=' | '>>=';
increment_decrement_operator:
'++' | '--';
integer_value:
'-'?INT+;
I tried to follow the smallJava exercise https://github.com/LorenzoBettini/packtpub-xtext-book-examples/blob/master/org.example.smalljava
but with no luck.
My scope provider code is like this:
def dispatch IScope symbolsDefinedBefore(Block b, EObject o) {
Scopes::scopeFor(b.blockStatements)
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Powered by
FUDForum. Page generated in 0.10036 seconds