As Fix 2 ME
XT -- A Bundle of Program Transformation Tools
AsFix2ME is a more compact variant of
AsFix2?. See the
AsFix topic for a general overview of
AsFix. This topic describes the difference between AsFix2 and AsFix2ME in more detail.
Literals in AsFix2ME
Consider the syntax definition
definition
module Exp
exports
sorts Exp
context-free syntax
"nil" -> Exp
lexical syntax
[\t\n\r\ ] -> LAYOUT
Representation in AsFix2ME:
appl(
prod([lit("nil")], cf(sort("Exp")), no-attrs)
, [lit("nil")]
)
Representation in AsFix2:
appl(
prod([lit("nil")], cf(sort("Exp")), no-attrs)
, [ appl(
prod(
[char-class([110]), char-class([105]), char-class([108])]
, lit("nil")
, no-attrs
)
, [110, 105, 108]
)
]
)
Layout in AsFix2ME
Lexical syntax in AsFix2ME
Consider the syntax definition
definition
module Exp
hiddens
sorts IntConst
exports
sorts Exp
lexical syntax
[\ \t\n] -> LAYOUT
[0-9]+ -> IntConst
context-free syntax
IntConst -> Exp {cons("Int")}
Producing a parse table:
sdf2table -i Exp-tiny.def.def -o Exp-tiny.tbl -m Exp
Stratego Script to extract the tree related to the context-free symbol IntConst:
import simple-traversal ;;
oncetd(?appl(prod(_, cf(sort("IntConst")), _), _); ?x) ;;
!x ;;
Parse the expression "12" to
AsFix2?
echo "1" | sglr -2 -p Exp-tiny.tbl | stratego-shell --script extract-lex.srts | pp-aterm
appl(
prod(
[lex(sort("IntConst"))]
, cf(sort("IntConst"))
, no-attrs
)
, [ appl(
prod(
[lex(iter(char-class([range(48, 57)])))]
, lex(sort("IntConst"))
, no-attrs
)
, [ appl(
prod(
[ lex(iter(char-class([range(48, 57)])))
, lex(iter(char-class([range(48, 57)])))
]
, lex(iter(char-class([range(48, 57)])))
, attrs([assoc(left)])
)
, [ appl(
prod(
[char-class([range(48, 57)])]
, lex(iter(char-class([range(48, 57)])))
, no-attrs
)
, [49]
)
, appl(
prod(
[char-class([range(48, 57)])]
, lex(iter(char-class([range(48, 57)])))
, no-attrs
)
, [50]
)
]
)
]
)
]
)
Parsing the same expression to
AsFix2ME:
echo "12" | sglr -m -p Exp-tiny.tbl | stratego-shell --script extract-cf.strs | pp-aterm
appl(
prod(
[lex(sort("IntConst"))]
, cf(sort("IntConst"))
, no-attrs
)
, [ appl(
list(iter-star(char-class([range(0, 255)])))
, [49, 50]
)
]
)
- Note: If we add a constructor to the IntConst production the constructor name will be lost.
Now consider the syntax definition:
definition
module Exp
hiddens
sorts DecConst
exports
sorts Exp
lexical syntax
[\ \t\n] -> LAYOUT
[0-9]+ "." [0-9]+ -> DecConst {cons("DecConst")}
context-free syntax
DecConst -> Exp
Parsing to AsFix2ME:
echo "13.25" | sglr -m -p Exp-tiny.tbl | stratego-shell --script extract-cf.strs | pp-aterm
appl(
prod(
[lex(sort("DecConst"))]
, cf(sort("DecConst"))
, no-attrs
)
, [ appl(
list(iter-star(char-class([range(0, 255)])))
, [49, 51, 46, 50, 53]
)
]
)
Syntax in AsFix2ME
Consider the syntax definition
definition
module Exp
hiddens
sorts DecConst
exports
sorts Exp
context-free syntax
DecConst -> Exp
syntax
[0-9]+ "." [0-9]+ -> DecConst {cons("DecConst")}
DecConst -> <DecConst-CF>
lexical syntax
[\t\n\r\ ] -> LAYOUT
In this case the DecConst application is represented as a tree in AsFix2ME, just like in AsFix2.