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 -> lexical syntax [\t\n\r\ ] -> LAYOUT -------------------------------------------------------- In this case the DecConst application is represented as a tree in AsFix2ME, just like in AsFix2.