if (symbol.isIter()) {
if (lex) {
return factory.constructor(Factory.Symbol_IterPlus, symbolAST2SymbolConstructor(symbol.getSymbol(), lex, layout));
}
else {
IValue layoutSymbol = factory.constructor(Factory.Symbol_LayoutX, factory.string(layout));
IValue elementSym = symbolAST2SymbolConstructor(symbol.getSymbol(), lex, layout);
IValue seps = factory.list(layoutSymbol);
return factory.constructor(Factory.Symbol_IterSepX, elementSym, seps);
}
}
if (symbol.isIterStar()) {
if (lex) {
return factory.constructor(Factory.Symbol_IterStar, symbolAST2SymbolConstructor(symbol.getSymbol(), lex, layout));
}
else {
IValue layoutSymbol = factory.constructor(Factory.Symbol_LayoutX, factory.string(layout));
IValue elementSym = symbolAST2SymbolConstructor(symbol.getSymbol(), lex, layout);
IValue seps = factory.list(layoutSymbol);
return factory.constructor(Factory.Symbol_IterStarSepX, elementSym, seps);
}
}
if (symbol.isIterSep()) {
IValue layoutSymbol = factory.constructor(Factory.Symbol_LayoutX, factory.string(layout));
IValue elementSym = symbolAST2SymbolConstructor(symbol.getSymbol(), lex, layout);
IValue sepSym = symbolAST2SymbolConstructor(symbol.getSep(), lex, layout);
IValue seps;
if (lex) {
seps = factory.list(sepSym);
}
else {
seps = factory.list(layoutSymbol, sepSym, layoutSymbol);
}
return factory.constructor(Factory.Symbol_IterSepX, elementSym, seps);
}
if (symbol.isIterStarSep()) {
IValue layoutSymbol = factory.constructor(Factory.Symbol_LayoutX, factory.string(layout));
IValue elementSym = symbolAST2SymbolConstructor(symbol.getSymbol(), lex, layout);
IValue sepSym = symbolAST2SymbolConstructor(symbol.getSep(), lex, layout);
IValue seps;
if (lex) {
seps = factory.list(sepSym);
}
else {
seps = factory.list(layoutSymbol, sepSym, layoutSymbol);
}
return factory.constructor(Factory.Symbol_IterStarSepX, elementSym, seps);
}
if (symbol.isLiteral()) {
return literal2Symbol(symbol.getString());
}
if (symbol.isOptional()) {
return factory.constructor(Factory.Symbol_Opt, symbolAST2SymbolConstructor(symbol.getSymbol(), lex, layout));
}
if (symbol.isStart()) {
Nonterminal nonterminal = symbol.getNonterminal();
return factory.constructor(Factory.Symbol_Start_Sort, factory.constructor(Factory.Symbol_Sort, factory.string(((Nonterminal.Lexical) nonterminal).getString())));
}
if (symbol.isNonterminal()) {
Nonterminal nonterminal = symbol.getNonterminal();
IString name = factory.string(((Nonterminal.Lexical) nonterminal).getString());
if (lex) {
return factory.constructor(Factory.Symbol_Lex, name);
}
else {
return factory.constructor(Factory.Symbol_Sort, name);
}
}
if(symbol.isSequence()){
List<Sym> symbols = symbol.getSequence();
IValue layoutSymbol = factory.constructor(Factory.Symbol_LayoutX, factory.string(layout));
IValue[] symValues = new IValue[lex ? symbols.size() : symbols.size() * 2 - 1];
for(int i = symbols.size() - 1; i >= 0; i -= lex ? 1 : 2) {
symValues[lex ? i : i * 2] = symbolAST2SymbolConstructor(symbols.get(i), lex, layout);
if (lex && i > 0) {
symValues[i - 1] = layoutSymbol;
}
}
IValue syms = factory.list(symValues);
return factory.constructor(Factory.Symbol_Seq, syms);
}
if(symbol.isAlternative()){
List<Sym> symbols = symbol.getSequence();
IValue[] symValues = new IValue[symbols.size()];
for(int i = symbols.size() - 1; i >= 0; --i){
symValues[i] = symbolAST2SymbolConstructor(symbols.get(i), lex, layout);
}
IValue syms = factory.list(symValues);
return factory.constructor(Factory.Symbol_Alt, syms);
}
if (symbol.isParametrized()) {
List<Sym> symbols = symbol.getParameters();
IValue[] symValues = new IValue[symbols.size()];
for(int i = symbols.size() - 1; i >= 0; --i){
symValues[i] = symbolAST2SymbolConstructor(symbols.get(i), lex, layout);
}
IValue syms = factory.list(symValues);
return factory.constructor(Factory.Symbol_ParameterizedSort, factory.string(((Nonterminal.Lexical) symbol.getNonterminal()).getString()), syms);
}
if (symbol.isPrecede() || symbol.isNotPrecede() || symbol.isFollow() || symbol.isNotFollow() || symbol.isColumn() || symbol.isStartOfLine() || symbol.isEndOfLine() || symbol.isExcept()) {
return symbolAST2SymbolConstructor(symbol.getSymbol(), lex, layout);