Skip to content

Commit 306dec8

Browse files
kmichaelk5nord
authored andcommitted
Support for dynamic templates
1 parent 4c086cf commit 306dec8

3 files changed

Lines changed: 98 additions & 2 deletions

File tree

ttcn3/syntax/nodes.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,12 @@ type (
326326
X Expr // Template expression
327327
}
328328

329+
// A DynamicExpr represents a "@dynamic" expression.
330+
DynamicExpr struct {
331+
Tok Token // Position of "dynamic"
332+
Body *BlockStmt // Template body
333+
}
334+
329335
// A DefKindExpr represents a definition kind expression, used by imports
330336
// and with-attributes.
331337
DefKindExpr struct {
@@ -372,6 +378,7 @@ func (x *RegexpExpr) exprNode() {}
372378
func (x *PatternExpr) exprNode() {}
373379
func (x *DecmatchExpr) exprNode() {}
374380
func (x *DecodedExpr) exprNode() {}
381+
func (x *DynamicExpr) exprNode() {}
375382
func (x *DefKindExpr) exprNode() {}
376383
func (x *ExceptExpr) exprNode() {}
377384

ttcn3/syntax/nodes_gen.go

Lines changed: 72 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ttcn3/syntax/parser.go

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -825,7 +825,10 @@ func (p *parser) parseOperand() Expr {
825825
return p.parseCallDecmatch()
826826

827827
case MODIF:
828-
return p.parseDecodedModifier()
828+
return p.parseModifier()
829+
830+
case VALUE:
831+
return p.make_use(p.consume())
829832

830833
default:
831834
p.errorExpected("operand")
@@ -905,6 +908,13 @@ func (p *parser) parseCallDecmatch() *DecmatchExpr {
905908
return c
906909
}
907910

911+
func (p *parser) parseModifier() Expr {
912+
if p.peek(1).String() == "@dynamic" {
913+
return p.parseDynamicModifier()
914+
}
915+
return p.parseDecodedModifier()
916+
}
917+
908918
func (p *parser) parseDecodedModifier() *DecodedExpr {
909919
d := new(DecodedExpr)
910920
d.Tok = p.expect(MODIF)
@@ -919,6 +929,13 @@ func (p *parser) parseDecodedModifier() *DecodedExpr {
919929
return d
920930
}
921931

932+
func (p *parser) parseDynamicModifier() *DynamicExpr {
933+
d := new(DynamicExpr)
934+
d.Tok = p.expect(MODIF)
935+
d.Body = p.parseBlockStmt()
936+
return d
937+
}
938+
922939
func (p *parser) parseSelectorExpr(x Expr) *SelectorExpr {
923940
return &SelectorExpr{X: x, Dot: p.consume(), Sel: p.parseRef()}
924941
}
@@ -1025,7 +1042,7 @@ func (p *parser) parseIdent() *Ident {
10251042
switch p.tok {
10261043
case UNIVERSAL:
10271044
return p.parseUniversalCharstring()
1028-
case IDENT, ADDRESS, ALIVE, CHARSTRING, CONTROL, TO, FROM, CREATE, CLASS:
1045+
case IDENT, ADDRESS, ALIVE, CHARSTRING, CONTROL, TO, FROM, CREATE, VALUE, CLASS:
10291046
return p.make_use(p.consume())
10301047
default:
10311048
p.expect(IDENT) // use expect() error handling

0 commit comments

Comments
 (0)