private AST.Statement ParseArrayVariableStatement(Lexer lexer) { var text = string.Empty; var token = lexer.InputToken(out text); if (token != Token.冒号) { lexer.ReturnToken(token, text); } var row = ParseExpression(lexer); token = lexer.InputToken(out text); if (token != Token.行) { throw new Exception($"语法错误,不是预期的输入:{text}。 在 {lexer.Line} 行,{lexer.Column}列"); } var col = ParseExpression(lexer); token = lexer.InputToken(out text); if (token != Token.列) { throw new Exception($"语法错误,不是预期的输入:{text}。 在 {lexer.Line} 行,{lexer.Column}列"); } token = lexer.InputToken(out text); if (token == Token.辅助标点) { token = lexer.InputToken(out text); } if (token != Token.取名为) { throw new Exception($"语法错误,不是预期的输入:{text}。 在 {lexer.Line} 行,{lexer.Column}列"); } token = lexer.InputToken(out text); if (token != Token.V名称符号) { throw new Exception($"语法错误,不是预期的输入:{text}。 在 {lexer.Line} 行,{lexer.Column}列"); } var name = ParseName(text); AST.Expression expression; if (row is AST.ConstantExpression && col is AST.ConstantExpression) { var r = (int)((row as AST.ConstantExpression).Value.AsReal()); var c = (int)((col as AST.ConstantExpression).Value.AsReal()); expression = new AST.ConstantExpression(new ArrayValue(r, c)); } else { expression = new AST.MakeArrayExpression(row, col, new BooleanValue(false)); } return(new AST.VariableStatement(name, expression)); }
private AST.Expression ParseExpressionL2(Lexer lexer) { AST.Expression expr = null; var text = string.Empty; var token = lexer.InputToken(out text); switch (token) { case Token.V名称符号: { var name = ParseName(text); token = lexer.InputToken(out text); if (token == Token.的第) { var row = ParseExpression(lexer); token = lexer.InputToken(out text); if (token != Token.行) { throw new Exception($"语法错误,不是预期的输入:{text}。 在 {lexer.Line} 行,{lexer.Column}列"); } var col = ParseExpression(lexer); token = lexer.InputToken(out text); if (token != Token.列) { throw new Exception($"语法错误,不是预期的输入:{text}。 在 {lexer.Line} 行,{lexer.Column}列"); } expr = new AST.ReadArrayVariableExpression(name, row, col); } else { lexer.ReturnToken(token, text); expr = new AST.ReadVariableExpression(name); } } break; case Token.V字符串值: { var svalue = ParseStringValue(text); expr = new AST.ConstantExpression(new StringValue(svalue)); } break; case Token.V数字值: { var dvalue = ParseNumberValue(text); if (((long)dvalue) == dvalue) { expr = new AST.ConstantExpression(new IntegerValue((long)dvalue)); } else { expr = new AST.ConstantExpression(new RealValue(dvalue)); } } break; case Token.真: { expr = new AST.ConstantExpression(new BooleanValue(true)); } break; case Token.假: { expr = new AST.ConstantExpression(new BooleanValue(false)); } break; case Token.方法调用: expr = ParseCallExpression(lexer, ParseName(text), false); break; default: throw new Exception($"语法错误,不是预期的输入:{text}。 在 {lexer.Line} 行,{lexer.Column}列"); } return(expr); }