Mercurial Hosting > luan
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" |