Skip to main content



      Home
Home » Modeling » TMF (Xtext) » problem for define dsl
problem for define dsl [message #902737] Mon, 20 August 2012 04:21 Go to next message
Eclipse UserFriend
Hi,

I'm working on a DSL but i have a problem with my grammar
I defined for DoLoop the keyword 'do' and 'loop'
i realised test with xtend but i see that keyword 'loop' it's not obligatory (test is ok without keyword 'loop')
I don't understand why
Maybe is not a good define

My dsl:

CompilationUnit:
instructions+=Instruction*;
Instruction:
ControleStructure|VariableDeclaration
|VariableAssignment|SymbolRef
;
ControleStructure:
DoLoop
;
DoLoop:
{DoLoop}
'do'
instructions+=Instruction*
'loop'
;
VariableDeclaration returns Symbol:
'dcl' name = ID type=Type/*( | ('like' variable=[VariableDeclaration |Type]))*/
('endloc')?('[,S]')?
;
Type:
ShortNumericType | NumericType | StringType | BCDType
;

ShortNumericType:
{ShortNumericType}'#';

NumericType:
{NumericType}'%';


StringType:
{StringType}'$'('='size=INT)?
;
BCDType:
{BCDType}('='size=INT)?;

VariableAssignment:
dcl=[Symbol]'='expr=Expression
;
Expression :
CompareOperator;

CompareOperator returns Expression:
ConditionalOR(( /* {Inclusion.left=current} '='|*/{Equality.left=current}'=='|{NoInclusion.left=current}'!='|{Different.left=current}'<>'|{Inferrior.left=current}'<'|{Superior.left=current}'>'|{SuperiorOrEqual.left=current}'>='|{InferriorOrEqual.left=current}'<=') right=ConditionalOR)*;

ConditionalOR returns Expression:
Addition (({ConditionalOR.left=current} 'or'|{ConditionalOX.left=current} 'ox'|{ConditionalAND.left=current} 'and'|{ConditionalNOT.left=current} 'not') right=Addition)*;
Addition returns Expression:
Multiplication (({Plus.left=current} '+' | {Minus.left=current} '-') right=Multiplication)*;

Multiplication returns Expression:
PrimaryExpression (({Multi.left=current} '*' | {Div.left=current} '/') right=PrimaryExpression)*;

PrimaryExpression returns Expression:
NumericInt|NumericReal|StringLiteral
|SymbolRef
| '(' Expression ')'
;

SymbolRef:
CallOrVariableSymbolRef
;

CallOrVariableSymbolRef:
('call')? symbol=[Symbol|ID] ("(" (arguments+=Expression)? ("," arguments+=Expression)* ")")?
;


StringLiteral:
stringValue=STRING
;
NumericInt:
value=INT;

NumericReal:
value=REAL;


test with xtend:

@RunWith(typeof(XtextRunner))
@InjectWith(typeof(LanguageInjectorProvider))
class test {
@Inject extension ParseHelper<CompilationUnit>

@Test
def void testSegmentLoopDeclaration()
{
val compilationUnit =
'''
program "MyProgramme"

segment 0
dcl a%
do
a=a+1


eseg 0
end
'''.parse

val instruction= compilationUnit.instructions.get(0)
val variable= instruction as Symbol
Assert::assertEquals("a", variable.name)
val num= variable.type
Assert::assertNotNull(num)
Assert::assertTrue(num instanceof NumericType)
val numericType= num as NumericType
Assert::assertNotNull(numericType)
val controleStructure=compilationUnit.instructions.get(1) as ControleStructure
val doLoop= controleStructure as DoLoop
Assert::assertNotNull(doLoop)//test should be false
val variableAssignement=doLoop.instructions.get(0) as VariableAssignment
val plus=variableAssignement.expr as Plus
Assert::assertNotNull(plus)
val variableOperande = plus.left as SymbolRef
val variable2 = variableOperande as CallOrVariableSymbolRef
Assert::assertEquals('a',variable2.symbol.name)
val numeric= plus.right as NumericInt
Assert::assertEquals(1,numeric.value)
}
}
But that's not working and I doubt that this is the right way. I'm new to Xtext and so this question might be quite stupid. Maybe somebody has an idea or can point me into the right direction? Thanks in advance!

Best regards,
Jérôme
Re: problem for define dsl [message #902780 is a reply to message #902737] Mon, 20 August 2012 08:03 Go to previous messageGo to next message
Eclipse UserFriend
when i defined dsl like this:


DoLoop:
{DoLoop}
'do'
instructions+=Instruction*
'loop'
;


And i realised test like this :
do
a=a+1



the test should be wrong because it doesn't have keyword 'loop'
but the test passed...
i don't understand why...
Re: problem for define dsl [message #903083 is a reply to message #902780] Tue, 21 August 2012 16:49 Go to previous messageGo to next message
Eclipse UserFriend
Hi,

you should assert something like compilationUnit.eResource.errors.isEmpty

The parser may recover from simple errors like missing keywords, but it
will notify users about them in the errors list of the resource.

Regards,
Sebastian
--
Looking for professional support for Xtext, Xtend or Eclipse Modeling?
Go visit: http://xtext.itemis.com

Am 20.08.12 14:04, schrieb Laigle jérôme:
> when i defined dsl like this:
>
> DoLoop:
> {DoLoop}
> 'do'
> instructions+=Instruction*
> 'loop'
> ;
>
>
> And i realised test like this :
> do
> a=a+1
>
>
>
> the test should be wrong because it doesn't have keyword 'loop'
> but the test passed...
> i don't understand why...
Re: problem for define dsl [message #903241 is a reply to message #903083] Wed, 22 August 2012 12:18 Go to previous message
Eclipse UserFriend
thank you

best regard
jérome
Previous Topic:Using the index with an hierarchically directory tree
Next Topic:Boolean literal serialization from GMF adding parens
Goto Forum:
  


Current Time: Wed Jul 16 03:31:17 EDT 2025

Powered by FUDForum. Page generated in 0.30853 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software

Back to the top