comparison core/src/luan/impl/LuanParser.java @ 655:e2be71451d04

compile TableExpr
author Franklin Schmidt <fschmidt@gmail.com>
date Tue, 05 Apr 2016 15:28:07 -0600
parents ea7dbd2dfa65
children 471be4752b9e
comparison
equal deleted inserted replaced
654:ea7dbd2dfa65 655:e2be71451d04
865 return parser.failure(null); 865 return parser.failure(null);
866 Spaces(in); 866 Spaces(in);
867 return parser.success( new VarArgs() ); 867 return parser.success( new VarArgs() );
868 } 868 }
869 869
870 private Expr TableExpr(In in) throws ParseException { 870 private ExpString TableExpr(In in) throws ParseException {
871 parser.begin(); 871 parser.begin();
872 if( !parser.match('{') ) 872 if( !parser.match('{') )
873 return parser.failure(null); 873 return parser.failure(null);
874 Spaces(In.NOTHING); 874 Spaces(In.NOTHING);
875 List<TableExpr.Field> fields = new ArrayList<TableExpr.Field>(); 875 List<ExpString> builder = new ArrayList<ExpString>();
876 List<Expressions> builder = new ArrayList<Expressions>(); 876 Field(builder);
877 Field(fields,builder);
878 while( FieldSep() ) { 877 while( FieldSep() ) {
879 Spaces(In.NOTHING); 878 Spaces(In.NOTHING);
880 Field(fields,builder); 879 Field(builder);
881 } 880 }
882 Expressions exp = exp(TemplateExpressions(In.NOTHING)); 881 ExpString exp = TemplateExpressions(In.NOTHING);
883 if( exp != null ) 882 if( exp != null )
884 builder.add(exp); 883 builder.add(exp);
885 if( !parser.match('}') ) 884 if( !parser.match('}') )
886 throw parser.exception("Expected table element or '}'"); 885 throw parser.exception("Expected table element or '}'");
887 Spaces(in); 886 Spaces(in);
888 return parser.success( new TableExpr( fields.toArray(new TableExpr.Field[0]), ExpList.build(builder) ) ); 887 String code = "LuanImpl.table(" + expString(builder).code + ")";
888 return parser.success( new ExpString(code,true,false) );
889 } 889 }
890 890
891 private boolean FieldSep() throws ParseException { 891 private boolean FieldSep() throws ParseException {
892 return parser.anyOf(",;") || EndOfLine(); 892 return parser.anyOf(",;") || EndOfLine();
893 } 893 }
894 894
895 private boolean Field(List<TableExpr.Field> fields,List<Expressions> builder) throws ParseException { 895 private boolean Field(List<ExpString> builder) throws ParseException {
896 parser.begin(); 896 parser.begin();
897 Expr exp = SubExpr(In.NOTHING); 897 Expr exp = SubExpr(In.NOTHING);
898 if( exp==null ) 898 if( exp==null )
899 exp = NameExpr(In.NOTHING); 899 exp = NameExpr(In.NOTHING);
900 if( exp!=null && parser.match('=') ) { 900 if( exp!=null && parser.match('=') ) {
901 Spaces(In.NOTHING); 901 Spaces(In.NOTHING);
902 fields.add( new TableExpr.Field( exp, required(expr(exp(ExprZ(In.NOTHING)))) ) ); 902 ExpString val = RequiredExpr(In.NOTHING).expr();
903 String code = "new TableField(" + new ExpString(exp).code + "," + val.code + ")";
904 builder.add( new ExpString(code,true,false) );
903 return parser.success(); 905 return parser.success();
904 } 906 }
905 parser.rollback(); 907 parser.rollback();
906 Expressions exprs = exp(ExprZ(In.NOTHING)); 908 ExpString exprs = ExprZ(In.NOTHING);
907 if( exprs != null ) { 909 if( exprs != null ) {
908 builder.add(exprs); 910 builder.add(exprs);
909 return parser.success(); 911 return parser.success();
910 } 912 }
911 return parser.failure(); 913 return parser.failure();
939 } 941 }
940 String name = Name(in); 942 String name = Name(in);
941 if( name != null ) 943 if( name != null )
942 return nameVar(name); 944 return nameVar(name);
943 Expressions exp; 945 Expressions exp;
944 exp = TableExpr(in); 946 exp = exp(TableExpr(in));
945 if( exp != null ) 947 if( exp != null )
946 return exprVar(exp); 948 return exprVar(exp);
947 exp = Literal(in); 949 exp = Literal(in);
948 if( exp != null ) 950 if( exp != null )
949 return exprVar(exp); 951 return exprVar(exp);
1058 if( !parser.match(')') ) 1060 if( !parser.match(')') )
1059 throw parser.exception("Expression or ')' expected"); 1061 throw parser.exception("Expression or ')' expected");
1060 Spaces(in); 1062 Spaces(in);
1061 return parser.success(); 1063 return parser.success();
1062 } 1064 }
1063 Expr exp = TableExpr(in); 1065 ExpString exp = TableExpr(in);
1064 if( exp != null ) { 1066 if( exp != null ) {
1065 builder.add(new ExpString(exp)); 1067 builder.add(exp);
1066 return parser.success(); 1068 return parser.success();
1067 } 1069 }
1068 String s = StringLiteral(in); 1070 String s = StringLiteral(in);
1069 if( s != null ) { 1071 if( s != null ) {
1070 builder.add( new ExpString(new ConstExpr(s)) ); 1072 builder.add( new ExpString(new ConstExpr(s)) );
1500 String superClass = isStmt ? "StmtExp" : "Expressions"; 1502 String superClass = isStmt ? "StmtExp" : "Expressions";
1501 String className = "EXP" + ++classCounter; 1503 String className = "EXP" + ++classCounter;
1502 String classCode = "" 1504 String classCode = ""
1503 +"package luan.impl;\n" 1505 +"package luan.impl;\n"
1504 +"import luan.Luan;\n" 1506 +"import luan.Luan;\n"
1507 +"import luan.LuanFunction;\n"
1505 +"import luan.LuanException;\n" 1508 +"import luan.LuanException;\n"
1506 +"\n" 1509 +"\n"
1507 +"public class " + className +" implements " + superClass + " {\n" 1510 +"public class " + className +" implements " + superClass + " {\n"
1508 +" @Override public Object eval(LuanStateImpl luan) throws LuanException {\n" 1511 +" @Override public Object eval(LuanStateImpl luan) throws LuanException {\n"
1509 +" Object cnd;\n" 1512 +" Object cnd;\n"