ifc-expressions 2.0.1-beta.0 → 2.0.1-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -2
- package/dist/IfcExpression.d.ts +30 -6
- package/dist/cjs/IfcExpression.js +64 -9
- package/dist/cjs/IfcExpression.js.map +1 -1
- package/dist/cjs/IfcExpressionErrorListener.js +1 -1
- package/dist/cjs/IfcExpressionErrorListener.js.map +1 -1
- package/dist/cjs/compiler/ExprCompiler.js +258 -0
- package/dist/cjs/compiler/ExprCompiler.js.map +1 -0
- package/dist/cjs/compiler/ExprManager.js +22 -0
- package/dist/cjs/compiler/ExprManager.js.map +1 -0
- package/dist/cjs/compiler/ExprToTextInputLinker.js +27 -0
- package/dist/cjs/compiler/ExprToTextInputLinker.js.map +1 -0
- package/dist/cjs/{IfcExpressionValidationListener.js → compiler/IfcExpressionValidationListener.js} +15 -12
- package/dist/cjs/compiler/IfcExpressionValidationListener.js.map +1 -0
- package/dist/cjs/{type → compiler}/TypeManager.js +1 -1
- package/dist/cjs/compiler/TypeManager.js.map +1 -0
- package/dist/cjs/context/IfcElementAccessor.js +1 -1
- package/dist/cjs/context/IfcElementAccessor.js.map +1 -1
- package/dist/cjs/context/IfcTypeObjectAccessor.js +1 -1
- package/dist/cjs/context/IfcTypeObjectAccessor.js.map +1 -1
- package/dist/cjs/error/ExceptionToExprEvalErrorMapper.js +2 -2
- package/dist/cjs/error/ExceptionToExprEvalErrorMapper.js.map +1 -1
- package/dist/cjs/error/SyntaxErrorException.js +1 -1
- package/dist/cjs/error/SyntaxErrorException.js.map +1 -1
- package/dist/cjs/error/ValidationException.js +4 -4
- package/dist/cjs/error/ValidationException.js.map +1 -1
- package/dist/cjs/error/mapper/MissingFunctionArgumentExceptionMapper.js +2 -1
- package/dist/cjs/error/mapper/MissingFunctionArgumentExceptionMapper.js.map +1 -1
- package/dist/cjs/error/mapper/NoSuchFunctionExceptionMapper.js +2 -1
- package/dist/cjs/error/mapper/NoSuchFunctionExceptionMapper.js.map +1 -1
- package/dist/cjs/error/mapper/SyntaxErrorMapper.js +2 -1
- package/dist/cjs/error/mapper/SyntaxErrorMapper.js.map +1 -1
- package/dist/cjs/error/mapper/ValidationExceptionMapper.js +2 -1
- package/dist/cjs/error/mapper/ValidationExceptionMapper.js.map +1 -1
- package/dist/cjs/error/mapper/WrongFunctionArgumentTypeExceptionMapper.js +2 -1
- package/dist/cjs/error/mapper/WrongFunctionArgumentTypeExceptionMapper.js.map +1 -1
- package/dist/cjs/expression/Expr.js.map +1 -1
- package/dist/cjs/expression/Expr0.js +4 -1
- package/dist/cjs/expression/Expr0.js.map +1 -1
- package/dist/cjs/expression/Expr1.js +10 -7
- package/dist/cjs/expression/Expr1.js.map +1 -1
- package/dist/cjs/expression/Expr2.js +9 -6
- package/dist/cjs/expression/Expr2.js.map +1 -1
- package/dist/cjs/expression/Expr2LeftBeforeRight.js +12 -6
- package/dist/cjs/expression/Expr2LeftBeforeRight.js.map +1 -1
- package/dist/cjs/expression/ExprBase.js +32 -0
- package/dist/cjs/expression/ExprBase.js.map +1 -1
- package/dist/cjs/expression/ExprEvalResult.js +36 -47
- package/dist/cjs/expression/ExprEvalResult.js.map +1 -1
- package/dist/cjs/expression/ExprKind.js +6 -12
- package/dist/cjs/expression/ExprKind.js.map +1 -1
- package/dist/cjs/expression/ExprStringBuilder.js +39 -0
- package/dist/cjs/expression/ExprStringBuilder.js.map +1 -0
- package/dist/cjs/expression/LiteralExpr.js +4 -1
- package/dist/cjs/expression/LiteralExpr.js.map +1 -1
- package/dist/cjs/expression/boolean/AndExpr.js +2 -2
- package/dist/cjs/expression/boolean/AndExpr.js.map +1 -1
- package/dist/cjs/expression/boolean/BooleanLiteralExpr.js +2 -2
- package/dist/cjs/expression/boolean/BooleanLiteralExpr.js.map +1 -1
- package/dist/cjs/expression/boolean/NotExpr.js +4 -4
- package/dist/cjs/expression/boolean/NotExpr.js.map +1 -1
- package/dist/cjs/expression/boolean/OrExpr.js +2 -2
- package/dist/cjs/expression/boolean/OrExpr.js.map +1 -1
- package/dist/cjs/expression/boolean/XorExpr.js +2 -2
- package/dist/cjs/expression/boolean/XorExpr.js.map +1 -1
- package/dist/cjs/expression/comparison/ComparisonOp.js +0 -3
- package/dist/cjs/expression/comparison/ComparisonOp.js.map +1 -1
- package/dist/cjs/expression/comparison/EqualsExpr.js +2 -2
- package/dist/cjs/expression/comparison/EqualsExpr.js.map +1 -1
- package/dist/cjs/expression/comparison/GreaterThan.js +3 -0
- package/dist/cjs/expression/comparison/GreaterThan.js.map +1 -1
- package/dist/cjs/expression/comparison/GreaterThanOrEqual.js +3 -0
- package/dist/cjs/expression/comparison/GreaterThanOrEqual.js.map +1 -1
- package/dist/cjs/expression/comparison/LessThan.js +3 -0
- package/dist/cjs/expression/comparison/LessThan.js.map +1 -1
- package/dist/cjs/expression/comparison/LessThanOrEqual.js +3 -0
- package/dist/cjs/expression/comparison/LessThanOrEqual.js.map +1 -1
- package/dist/cjs/expression/comparison/NotEqualsExpr.js +2 -2
- package/dist/cjs/expression/comparison/NotEqualsExpr.js.map +1 -1
- package/dist/cjs/expression/function/Func.js +10 -10
- package/dist/cjs/expression/function/Func.js.map +1 -1
- package/dist/cjs/expression/function/FuncArg.js +2 -2
- package/dist/cjs/expression/function/FuncArg.js.map +1 -1
- package/dist/cjs/expression/function/FunctionExpr.js +18 -6
- package/dist/cjs/expression/function/FunctionExpr.js.map +1 -1
- package/dist/cjs/expression/function/IfcExpressionFunctions.js +25 -32
- package/dist/cjs/expression/function/IfcExpressionFunctions.js.map +1 -1
- package/dist/cjs/expression/function/arg/FuncArgBase.js +5 -6
- package/dist/cjs/expression/function/arg/FuncArgBase.js.map +1 -1
- package/dist/cjs/expression/function/arg/FuncArgBoolean.js +2 -2
- package/dist/cjs/expression/function/arg/FuncArgBoolean.js.map +1 -1
- package/dist/cjs/expression/function/arg/FuncArgInt.js +3 -3
- package/dist/cjs/expression/function/arg/FuncArgInt.js.map +1 -1
- package/dist/cjs/expression/function/arg/FuncArgMappings.js +8 -8
- package/dist/cjs/expression/function/arg/FuncArgMappings.js.map +1 -1
- package/dist/cjs/expression/function/arg/FuncArgNumeric.js +2 -2
- package/dist/cjs/expression/function/arg/FuncArgNumeric.js.map +1 -1
- package/dist/cjs/expression/function/arg/FuncArgObjectAccessor.js +2 -2
- package/dist/cjs/expression/function/arg/FuncArgObjectAccessor.js.map +1 -1
- package/dist/cjs/expression/function/arg/FuncArgRegex.js +2 -2
- package/dist/cjs/expression/function/arg/FuncArgRegex.js.map +1 -1
- package/dist/cjs/expression/function/arg/FuncArgString.js +2 -2
- package/dist/cjs/expression/function/arg/FuncArgString.js.map +1 -1
- package/dist/cjs/expression/function/impl/AttributeAccessorFunction.js +1 -1
- package/dist/cjs/expression/function/impl/AttributeAccessorFunction.js.map +1 -1
- package/dist/cjs/expression/function/impl/{SWITCH.js → CHOOSE.js} +25 -21
- package/dist/cjs/expression/function/impl/CHOOSE.js.map +1 -0
- package/dist/cjs/expression/function/impl/CompareMagnitudes.js +3 -3
- package/dist/cjs/expression/function/impl/CompareMagnitudes.js.map +1 -1
- package/dist/cjs/expression/function/impl/EQUALS.js +1 -1
- package/dist/cjs/expression/function/impl/EQUALS.js.map +1 -1
- package/dist/cjs/expression/function/impl/EXISTS.js +3 -3
- package/dist/cjs/expression/function/impl/EXISTS.js.map +1 -1
- package/dist/cjs/expression/function/impl/FuncBooleanBinary.js +1 -1
- package/dist/cjs/expression/function/impl/FuncBooleanBinary.js.map +1 -1
- package/dist/cjs/expression/function/impl/IF.js +34 -0
- package/dist/cjs/expression/function/impl/IF.js.map +1 -0
- package/dist/cjs/expression/function/impl/MAP.js +13 -11
- package/dist/cjs/expression/function/impl/MAP.js.map +1 -1
- package/dist/cjs/expression/function/impl/MatchesPattern.js +2 -2
- package/dist/cjs/expression/function/impl/MatchesPattern.js.map +1 -1
- package/dist/cjs/expression/function/impl/NOT.js +1 -1
- package/dist/cjs/expression/function/impl/NOT.js.map +1 -1
- package/dist/cjs/expression/function/impl/PROPERTY.js +6 -6
- package/dist/cjs/expression/function/impl/PROPERTY.js.map +1 -1
- package/dist/cjs/expression/function/impl/PROPERTYSET.js +12 -12
- package/dist/cjs/expression/function/impl/PROPERTYSET.js.map +1 -1
- package/dist/cjs/expression/function/impl/ROUND.js +1 -1
- package/dist/cjs/expression/function/impl/ROUND.js.map +1 -1
- package/dist/cjs/expression/function/impl/ReplacePattern.js +1 -1
- package/dist/cjs/expression/function/impl/ReplacePattern.js.map +1 -1
- package/dist/cjs/expression/function/impl/TOSTRING.js +1 -1
- package/dist/cjs/expression/function/impl/TOSTRING.js.map +1 -1
- package/dist/cjs/expression/function/impl/TYPE.js +4 -4
- package/dist/cjs/expression/function/impl/TYPE.js.map +1 -1
- package/dist/cjs/expression/numeric/DivideExpr.js +3 -3
- package/dist/cjs/expression/numeric/DivideExpr.js.map +1 -1
- package/dist/cjs/expression/numeric/MinusExpr.js +2 -2
- package/dist/cjs/expression/numeric/MinusExpr.js.map +1 -1
- package/dist/cjs/expression/numeric/MultiplyExpr.js +2 -2
- package/dist/cjs/expression/numeric/MultiplyExpr.js.map +1 -1
- package/dist/cjs/expression/numeric/NumericLiteralExpr.js +2 -2
- package/dist/cjs/expression/numeric/NumericLiteralExpr.js.map +1 -1
- package/dist/cjs/expression/numeric/PlusExpr.js +2 -2
- package/dist/cjs/expression/numeric/PlusExpr.js.map +1 -1
- package/dist/cjs/expression/numeric/PowerExpr.js +2 -2
- package/dist/cjs/expression/numeric/PowerExpr.js.map +1 -1
- package/dist/cjs/expression/numeric/UnaryMinusExpr.js +2 -2
- package/dist/cjs/expression/numeric/UnaryMinusExpr.js.map +1 -1
- package/dist/cjs/expression/poly/PlusOrConcatExpr.js +3 -3
- package/dist/cjs/expression/poly/PlusOrConcatExpr.js.map +1 -1
- package/dist/cjs/expression/reference/ElemObjectReferenceExpr.js +2 -2
- package/dist/cjs/expression/reference/ElemObjectReferenceExpr.js.map +1 -1
- package/dist/cjs/expression/reference/PropObjectReferenceExpr.js +2 -2
- package/dist/cjs/expression/reference/PropObjectReferenceExpr.js.map +1 -1
- package/dist/cjs/expression/string/StringConcatExpr.js +2 -2
- package/dist/cjs/expression/string/StringConcatExpr.js.map +1 -1
- package/dist/cjs/expression/string/StringLiteralExpr.js +5 -2
- package/dist/cjs/expression/string/StringLiteralExpr.js.map +1 -1
- package/dist/cjs/expression/structure/ArrayExpr.js +9 -3
- package/dist/cjs/expression/structure/ArrayExpr.js.map +1 -1
- package/dist/cjs/expression/structure/ParenthesisExpr.js +4 -4
- package/dist/cjs/expression/structure/ParenthesisExpr.js.map +1 -1
- package/dist/cjs/postprocess/ExprVisitor.js +9 -0
- package/dist/cjs/postprocess/ExprVisitor.js.map +1 -0
- package/dist/cjs/postprocess/ExprWalker.js +17 -0
- package/dist/cjs/postprocess/ExprWalker.js.map +1 -0
- package/dist/cjs/type/SimpleType.js +1 -1
- package/dist/cjs/type/SimpleType.js.map +1 -1
- package/dist/cjs/type/Types.js +5 -1
- package/dist/cjs/type/Types.js.map +1 -1
- package/dist/cjs/util/IfcExpressionUtils.js.map +1 -0
- package/dist/cjs/util/TextPosition.js +45 -0
- package/dist/cjs/util/TextPosition.js.map +1 -0
- package/dist/cjs/util/TextSpan.js +111 -0
- package/dist/cjs/util/TextSpan.js.map +1 -0
- package/dist/cjs/value/Comparable.js +1 -1
- package/dist/cjs/value/Comparable.js.map +1 -1
- package/dist/cjs/value/ObjectAccessorValue.js +1 -1
- package/dist/cjs/value/ObjectAccessorValue.js.map +1 -1
- package/dist/{ExprVisitor.d.ts → compiler/ExprCompiler.d.ts} +9 -5
- package/dist/compiler/ExprManager.d.ts +8 -0
- package/dist/compiler/ExprToTextInputLinker.d.ts +10 -0
- package/dist/{IfcExpressionValidationListener.d.ts → compiler/IfcExpressionValidationListener.d.ts} +3 -3
- package/dist/{type → compiler}/TypeManager.d.ts +1 -1
- package/dist/expression/Expr.d.ts +6 -1
- package/dist/expression/Expr0.d.ts +2 -0
- package/dist/expression/Expr1.d.ts +3 -2
- package/dist/expression/Expr2.d.ts +1 -0
- package/dist/expression/Expr2LeftBeforeRight.d.ts +1 -0
- package/dist/expression/ExprBase.d.ts +9 -1
- package/dist/expression/ExprEvalResult.d.ts +20 -35
- package/dist/expression/ExprKind.d.ts +6 -12
- package/dist/expression/ExprStringBuilder.d.ts +13 -0
- package/dist/expression/LiteralExpr.d.ts +2 -0
- package/dist/expression/boolean/AndExpr.d.ts +2 -1
- package/dist/expression/boolean/BooleanLiteralExpr.d.ts +2 -1
- package/dist/expression/boolean/NotExpr.d.ts +3 -2
- package/dist/expression/boolean/OrExpr.d.ts +2 -1
- package/dist/expression/boolean/XorExpr.d.ts +2 -1
- package/dist/expression/comparison/ComparisonOp.d.ts +1 -2
- package/dist/expression/comparison/EqualsExpr.d.ts +2 -1
- package/dist/expression/comparison/GreaterThan.d.ts +2 -0
- package/dist/expression/comparison/GreaterThanOrEqual.d.ts +2 -0
- package/dist/expression/comparison/LessThan.d.ts +2 -0
- package/dist/expression/comparison/LessThanOrEqual.d.ts +2 -0
- package/dist/expression/comparison/NotEqualsExpr.d.ts +2 -1
- package/dist/expression/function/Func.d.ts +6 -5
- package/dist/expression/function/FuncArg.d.ts +2 -1
- package/dist/expression/function/FunctionExpr.d.ts +4 -1
- package/dist/expression/function/IfcExpressionFunctions.d.ts +1 -3
- package/dist/expression/function/arg/FuncArgBase.d.ts +4 -4
- package/dist/expression/function/arg/FuncArgBoolean.d.ts +2 -1
- package/dist/expression/function/arg/FuncArgInt.d.ts +2 -1
- package/dist/expression/function/arg/FuncArgMappings.d.ts +3 -2
- package/dist/expression/function/arg/FuncArgNumeric.d.ts +2 -1
- package/dist/expression/function/arg/FuncArgObjectAccessor.d.ts +2 -1
- package/dist/expression/function/arg/FuncArgRegex.d.ts +2 -1
- package/dist/expression/function/arg/FuncArgString.d.ts +2 -1
- package/dist/expression/function/impl/AttributeAccessorFunction.d.ts +2 -1
- package/dist/expression/function/impl/{SWITCH.d.ts → CHOOSE.d.ts} +5 -3
- package/dist/expression/function/impl/CompareMagnitudes.d.ts +2 -1
- package/dist/expression/function/impl/EQUALS.d.ts +2 -1
- package/dist/expression/function/impl/EXISTS.d.ts +3 -2
- package/dist/expression/function/impl/FuncBooleanBinary.d.ts +2 -1
- package/dist/expression/function/impl/IF.d.ts +13 -0
- package/dist/expression/function/impl/MAP.d.ts +4 -2
- package/dist/expression/function/impl/MatchesPattern.d.ts +2 -1
- package/dist/expression/function/impl/NOT.d.ts +2 -1
- package/dist/expression/function/impl/PROPERTY.d.ts +2 -1
- package/dist/expression/function/impl/PROPERTYSET.d.ts +2 -1
- package/dist/expression/function/impl/ROUND.d.ts +2 -1
- package/dist/expression/function/impl/ReplacePattern.d.ts +2 -1
- package/dist/expression/function/impl/TOSTRING.d.ts +2 -1
- package/dist/expression/function/impl/TYPE.d.ts +2 -1
- package/dist/expression/numeric/DivideExpr.d.ts +2 -1
- package/dist/expression/numeric/MinusExpr.d.ts +2 -1
- package/dist/expression/numeric/MultiplyExpr.d.ts +2 -1
- package/dist/expression/numeric/NumericLiteralExpr.d.ts +2 -1
- package/dist/expression/numeric/PlusExpr.d.ts +2 -1
- package/dist/expression/numeric/PowerExpr.d.ts +2 -1
- package/dist/expression/numeric/UnaryMinusExpr.d.ts +2 -1
- package/dist/expression/poly/PlusOrConcatExpr.d.ts +2 -1
- package/dist/expression/reference/ElemObjectReferenceExpr.d.ts +2 -1
- package/dist/expression/reference/PropObjectReferenceExpr.d.ts +2 -1
- package/dist/expression/string/StringConcatExpr.d.ts +2 -1
- package/dist/expression/string/StringLiteralExpr.d.ts +2 -1
- package/dist/expression/structure/ArrayExpr.d.ts +3 -1
- package/dist/expression/structure/ParenthesisExpr.d.ts +2 -1
- package/dist/mjs/IfcExpression.js +63 -8
- package/dist/mjs/IfcExpression.js.map +1 -1
- package/dist/mjs/IfcExpressionErrorListener.js +1 -1
- package/dist/mjs/IfcExpressionErrorListener.js.map +1 -1
- package/dist/mjs/compiler/ExprCompiler.js +251 -0
- package/dist/mjs/compiler/ExprCompiler.js.map +1 -0
- package/dist/mjs/compiler/ExprManager.js +18 -0
- package/dist/mjs/compiler/ExprManager.js.map +1 -0
- package/dist/mjs/compiler/ExprToTextInputLinker.js +23 -0
- package/dist/mjs/compiler/ExprToTextInputLinker.js.map +1 -0
- package/dist/mjs/{IfcExpressionValidationListener.js → compiler/IfcExpressionValidationListener.js} +15 -12
- package/dist/mjs/compiler/IfcExpressionValidationListener.js.map +1 -0
- package/dist/mjs/{type → compiler}/TypeManager.js +1 -1
- package/dist/mjs/compiler/TypeManager.js.map +1 -0
- package/dist/mjs/context/IfcElementAccessor.js +1 -1
- package/dist/mjs/context/IfcElementAccessor.js.map +1 -1
- package/dist/mjs/context/IfcTypeObjectAccessor.js +1 -1
- package/dist/mjs/context/IfcTypeObjectAccessor.js.map +1 -1
- package/dist/mjs/error/ExceptionToExprEvalErrorMapper.js +2 -2
- package/dist/mjs/error/ExceptionToExprEvalErrorMapper.js.map +1 -1
- package/dist/mjs/error/SyntaxErrorException.js +1 -1
- package/dist/mjs/error/SyntaxErrorException.js.map +1 -1
- package/dist/mjs/error/ValidationException.js +4 -4
- package/dist/mjs/error/ValidationException.js.map +1 -1
- package/dist/mjs/error/mapper/MissingFunctionArgumentExceptionMapper.js +2 -1
- package/dist/mjs/error/mapper/MissingFunctionArgumentExceptionMapper.js.map +1 -1
- package/dist/mjs/error/mapper/NoSuchFunctionExceptionMapper.js +2 -1
- package/dist/mjs/error/mapper/NoSuchFunctionExceptionMapper.js.map +1 -1
- package/dist/mjs/error/mapper/SyntaxErrorMapper.js +2 -1
- package/dist/mjs/error/mapper/SyntaxErrorMapper.js.map +1 -1
- package/dist/mjs/error/mapper/ValidationExceptionMapper.js +2 -1
- package/dist/mjs/error/mapper/ValidationExceptionMapper.js.map +1 -1
- package/dist/mjs/error/mapper/WrongFunctionArgumentTypeExceptionMapper.js +2 -1
- package/dist/mjs/error/mapper/WrongFunctionArgumentTypeExceptionMapper.js.map +1 -1
- package/dist/mjs/expression/Expr.js.map +1 -1
- package/dist/mjs/expression/Expr0.js +4 -1
- package/dist/mjs/expression/Expr0.js.map +1 -1
- package/dist/mjs/expression/Expr1.js +11 -8
- package/dist/mjs/expression/Expr1.js.map +1 -1
- package/dist/mjs/expression/Expr2.js +10 -7
- package/dist/mjs/expression/Expr2.js.map +1 -1
- package/dist/mjs/expression/Expr2LeftBeforeRight.js +13 -7
- package/dist/mjs/expression/Expr2LeftBeforeRight.js.map +1 -1
- package/dist/mjs/expression/ExprBase.js +33 -1
- package/dist/mjs/expression/ExprBase.js.map +1 -1
- package/dist/mjs/expression/ExprEvalResult.js +35 -45
- package/dist/mjs/expression/ExprEvalResult.js.map +1 -1
- package/dist/mjs/expression/ExprKind.js +6 -12
- package/dist/mjs/expression/ExprKind.js.map +1 -1
- package/dist/mjs/expression/ExprStringBuilder.js +35 -0
- package/dist/mjs/expression/ExprStringBuilder.js.map +1 -0
- package/dist/mjs/expression/LiteralExpr.js +4 -1
- package/dist/mjs/expression/LiteralExpr.js.map +1 -1
- package/dist/mjs/expression/boolean/AndExpr.js +2 -2
- package/dist/mjs/expression/boolean/AndExpr.js.map +1 -1
- package/dist/mjs/expression/boolean/BooleanLiteralExpr.js +2 -2
- package/dist/mjs/expression/boolean/BooleanLiteralExpr.js.map +1 -1
- package/dist/mjs/expression/boolean/NotExpr.js +4 -4
- package/dist/mjs/expression/boolean/NotExpr.js.map +1 -1
- package/dist/mjs/expression/boolean/OrExpr.js +2 -2
- package/dist/mjs/expression/boolean/OrExpr.js.map +1 -1
- package/dist/mjs/expression/boolean/XorExpr.js +2 -2
- package/dist/mjs/expression/boolean/XorExpr.js.map +1 -1
- package/dist/mjs/expression/comparison/ComparisonOp.js +0 -3
- package/dist/mjs/expression/comparison/ComparisonOp.js.map +1 -1
- package/dist/mjs/expression/comparison/EqualsExpr.js +2 -2
- package/dist/mjs/expression/comparison/EqualsExpr.js.map +1 -1
- package/dist/mjs/expression/comparison/GreaterThan.js +3 -0
- package/dist/mjs/expression/comparison/GreaterThan.js.map +1 -1
- package/dist/mjs/expression/comparison/GreaterThanOrEqual.js +3 -0
- package/dist/mjs/expression/comparison/GreaterThanOrEqual.js.map +1 -1
- package/dist/mjs/expression/comparison/LessThan.js +3 -0
- package/dist/mjs/expression/comparison/LessThan.js.map +1 -1
- package/dist/mjs/expression/comparison/LessThanOrEqual.js +3 -0
- package/dist/mjs/expression/comparison/LessThanOrEqual.js.map +1 -1
- package/dist/mjs/expression/comparison/NotEqualsExpr.js +2 -2
- package/dist/mjs/expression/comparison/NotEqualsExpr.js.map +1 -1
- package/dist/mjs/expression/function/Func.js +11 -11
- package/dist/mjs/expression/function/Func.js.map +1 -1
- package/dist/mjs/expression/function/FuncArg.js +2 -2
- package/dist/mjs/expression/function/FuncArg.js.map +1 -1
- package/dist/mjs/expression/function/FunctionExpr.js +19 -7
- package/dist/mjs/expression/function/FunctionExpr.js.map +1 -1
- package/dist/mjs/expression/function/IfcExpressionFunctions.js +24 -31
- package/dist/mjs/expression/function/IfcExpressionFunctions.js.map +1 -1
- package/dist/mjs/expression/function/arg/FuncArgBase.js +5 -6
- package/dist/mjs/expression/function/arg/FuncArgBase.js.map +1 -1
- package/dist/mjs/expression/function/arg/FuncArgBoolean.js +2 -2
- package/dist/mjs/expression/function/arg/FuncArgBoolean.js.map +1 -1
- package/dist/mjs/expression/function/arg/FuncArgInt.js +3 -3
- package/dist/mjs/expression/function/arg/FuncArgInt.js.map +1 -1
- package/dist/mjs/expression/function/arg/FuncArgMappings.js +8 -8
- package/dist/mjs/expression/function/arg/FuncArgMappings.js.map +1 -1
- package/dist/mjs/expression/function/arg/FuncArgNumeric.js +2 -2
- package/dist/mjs/expression/function/arg/FuncArgNumeric.js.map +1 -1
- package/dist/mjs/expression/function/arg/FuncArgObjectAccessor.js +2 -2
- package/dist/mjs/expression/function/arg/FuncArgObjectAccessor.js.map +1 -1
- package/dist/mjs/expression/function/arg/FuncArgRegex.js +2 -2
- package/dist/mjs/expression/function/arg/FuncArgRegex.js.map +1 -1
- package/dist/mjs/expression/function/arg/FuncArgString.js +2 -2
- package/dist/mjs/expression/function/arg/FuncArgString.js.map +1 -1
- package/dist/mjs/expression/function/impl/AttributeAccessorFunction.js +1 -1
- package/dist/mjs/expression/function/impl/AttributeAccessorFunction.js.map +1 -1
- package/dist/mjs/expression/function/impl/{SWITCH.js → CHOOSE.js} +24 -20
- package/dist/mjs/expression/function/impl/CHOOSE.js.map +1 -0
- package/dist/mjs/expression/function/impl/CompareMagnitudes.js +3 -3
- package/dist/mjs/expression/function/impl/CompareMagnitudes.js.map +1 -1
- package/dist/mjs/expression/function/impl/EQUALS.js +1 -1
- package/dist/mjs/expression/function/impl/EQUALS.js.map +1 -1
- package/dist/mjs/expression/function/impl/EXISTS.js +3 -3
- package/dist/mjs/expression/function/impl/EXISTS.js.map +1 -1
- package/dist/mjs/expression/function/impl/FuncBooleanBinary.js +1 -1
- package/dist/mjs/expression/function/impl/FuncBooleanBinary.js.map +1 -1
- package/dist/mjs/expression/function/impl/IF.js +30 -0
- package/dist/mjs/expression/function/impl/IF.js.map +1 -0
- package/dist/mjs/expression/function/impl/MAP.js +13 -11
- package/dist/mjs/expression/function/impl/MAP.js.map +1 -1
- package/dist/mjs/expression/function/impl/MatchesPattern.js +2 -2
- package/dist/mjs/expression/function/impl/MatchesPattern.js.map +1 -1
- package/dist/mjs/expression/function/impl/NOT.js +1 -1
- package/dist/mjs/expression/function/impl/NOT.js.map +1 -1
- package/dist/mjs/expression/function/impl/PROPERTY.js +6 -6
- package/dist/mjs/expression/function/impl/PROPERTY.js.map +1 -1
- package/dist/mjs/expression/function/impl/PROPERTYSET.js +12 -12
- package/dist/mjs/expression/function/impl/PROPERTYSET.js.map +1 -1
- package/dist/mjs/expression/function/impl/ROUND.js +1 -1
- package/dist/mjs/expression/function/impl/ROUND.js.map +1 -1
- package/dist/mjs/expression/function/impl/ReplacePattern.js +1 -1
- package/dist/mjs/expression/function/impl/ReplacePattern.js.map +1 -1
- package/dist/mjs/expression/function/impl/TOSTRING.js +1 -1
- package/dist/mjs/expression/function/impl/TOSTRING.js.map +1 -1
- package/dist/mjs/expression/function/impl/TYPE.js +4 -4
- package/dist/mjs/expression/function/impl/TYPE.js.map +1 -1
- package/dist/mjs/expression/numeric/DivideExpr.js +3 -3
- package/dist/mjs/expression/numeric/DivideExpr.js.map +1 -1
- package/dist/mjs/expression/numeric/MinusExpr.js +2 -2
- package/dist/mjs/expression/numeric/MinusExpr.js.map +1 -1
- package/dist/mjs/expression/numeric/MultiplyExpr.js +2 -2
- package/dist/mjs/expression/numeric/MultiplyExpr.js.map +1 -1
- package/dist/mjs/expression/numeric/NumericLiteralExpr.js +2 -2
- package/dist/mjs/expression/numeric/NumericLiteralExpr.js.map +1 -1
- package/dist/mjs/expression/numeric/PlusExpr.js +2 -2
- package/dist/mjs/expression/numeric/PlusExpr.js.map +1 -1
- package/dist/mjs/expression/numeric/PowerExpr.js +2 -2
- package/dist/mjs/expression/numeric/PowerExpr.js.map +1 -1
- package/dist/mjs/expression/numeric/UnaryMinusExpr.js +2 -2
- package/dist/mjs/expression/numeric/UnaryMinusExpr.js.map +1 -1
- package/dist/mjs/expression/poly/PlusOrConcatExpr.js +3 -3
- package/dist/mjs/expression/poly/PlusOrConcatExpr.js.map +1 -1
- package/dist/mjs/expression/reference/ElemObjectReferenceExpr.js +2 -2
- package/dist/mjs/expression/reference/ElemObjectReferenceExpr.js.map +1 -1
- package/dist/mjs/expression/reference/PropObjectReferenceExpr.js +2 -2
- package/dist/mjs/expression/reference/PropObjectReferenceExpr.js.map +1 -1
- package/dist/mjs/expression/string/StringConcatExpr.js +2 -2
- package/dist/mjs/expression/string/StringConcatExpr.js.map +1 -1
- package/dist/mjs/expression/string/StringLiteralExpr.js +5 -2
- package/dist/mjs/expression/string/StringLiteralExpr.js.map +1 -1
- package/dist/mjs/expression/structure/ArrayExpr.js +10 -4
- package/dist/mjs/expression/structure/ArrayExpr.js.map +1 -1
- package/dist/mjs/expression/structure/ParenthesisExpr.js +4 -4
- package/dist/mjs/expression/structure/ParenthesisExpr.js.map +1 -1
- package/dist/mjs/postprocess/ExprVisitor.js +5 -0
- package/dist/mjs/postprocess/ExprVisitor.js.map +1 -0
- package/dist/mjs/postprocess/ExprWalker.js +13 -0
- package/dist/mjs/postprocess/ExprWalker.js.map +1 -0
- package/dist/mjs/type/SimpleType.js +1 -1
- package/dist/mjs/type/SimpleType.js.map +1 -1
- package/dist/mjs/type/Types.js +5 -1
- package/dist/mjs/type/Types.js.map +1 -1
- package/dist/mjs/util/IfcExpressionUtils.js.map +1 -0
- package/dist/mjs/util/TextPosition.js +41 -0
- package/dist/mjs/util/TextPosition.js.map +1 -0
- package/dist/mjs/util/TextSpan.js +107 -0
- package/dist/mjs/util/TextSpan.js.map +1 -0
- package/dist/mjs/value/Comparable.js +1 -1
- package/dist/mjs/value/Comparable.js.map +1 -1
- package/dist/mjs/value/ObjectAccessorValue.js +1 -1
- package/dist/mjs/value/ObjectAccessorValue.js.map +1 -1
- package/dist/postprocess/ExprVisitor.d.ts +5 -0
- package/dist/postprocess/ExprWalker.d.ts +7 -0
- package/dist/type/Types.d.ts +1 -2
- package/dist/util/TextPosition.d.ts +15 -0
- package/dist/util/TextSpan.d.ts +13 -0
- package/package.json +1 -1
- package/dist/cjs/ExprVisitor.js +0 -244
- package/dist/cjs/ExprVisitor.js.map +0 -1
- package/dist/cjs/IfcExpressionUtils.js.map +0 -1
- package/dist/cjs/IfcExpressionValidationListener.js.map +0 -1
- package/dist/cjs/expression/function/impl/SWITCH.js.map +0 -1
- package/dist/cjs/type/TypeManager.js.map +0 -1
- package/dist/mjs/ExprVisitor.js +0 -237
- package/dist/mjs/ExprVisitor.js.map +0 -1
- package/dist/mjs/IfcExpressionUtils.js.map +0 -1
- package/dist/mjs/IfcExpressionValidationListener.js.map +0 -1
- package/dist/mjs/expression/function/impl/SWITCH.js.map +0 -1
- package/dist/mjs/type/TypeManager.js.map +0 -1
- /package/dist/cjs/{IfcExpressionUtils.js → util/IfcExpressionUtils.js} +0 -0
- /package/dist/mjs/{IfcExpressionUtils.js → util/IfcExpressionUtils.js} +0 -0
- /package/dist/{IfcExpressionUtils.d.ts → util/IfcExpressionUtils.d.ts} +0 -0
package/README.md
CHANGED
|
@@ -151,8 +151,10 @@ An expression can be
|
|
|
151
151
|
|
|
152
152
|
`exists(object: ifcObjectRef): boolean` check whether an object reference obtained by the above methods actually exists (suppresses the error they generate)
|
|
153
153
|
|
|
154
|
-
#### Translation functions
|
|
154
|
+
#### Translation and condition functions
|
|
155
155
|
|
|
156
156
|
`map(input, mapping: [[in, out], [in, out], ... ], default)`: finds the first `[in,out]` pair in the specified mapping where `in == input` and returns that pair's `out` value. If none is found, `default` is returned.
|
|
157
157
|
|
|
158
|
-
|
|
158
|
+
`if(condition, thenValue, elseValue)`: returns `thenValue` if `condition` is `true`, `elseValue` otherwise.
|
|
159
|
+
|
|
160
|
+
`choose([[condition, out], [condition, out], ... ], default)`: finds the first `[condition, out]` pair where `condition == true` and returns its `out` value. In none is found, `default` is returned.
|
package/dist/IfcExpression.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ErrorListener, ParserRuleContext, Token } from "antlr4";
|
|
2
|
-
import {
|
|
2
|
+
import { ExprCompiler } from "./compiler/ExprCompiler.js";
|
|
3
3
|
import { IfcExpressionErrorListener } from "./IfcExpressionErrorListener.js";
|
|
4
|
-
import { isNullish, isPresent } from "./IfcExpressionUtils.js";
|
|
4
|
+
import { isNullish, isPresent } from "./util/IfcExpressionUtils.js";
|
|
5
5
|
import { IfcExpressionContext } from "./context/IfcExpressionContext.js";
|
|
6
6
|
import { Expr } from "./expression/Expr.js";
|
|
7
7
|
import { IfcElementAccessor } from "./context/IfcElementAccessor.js";
|
|
@@ -23,18 +23,42 @@ import type { ExpressionValue } from "./value/ExpressionValue.js";
|
|
|
23
23
|
import type { BoxedValueTypes } from "./value/BoxedValueTypes.js";
|
|
24
24
|
import { ExprEvalError, ExprEvalResult, isExprEvalError, isExprEvalSuccess } from "./expression/ExprEvalResult.js";
|
|
25
25
|
import { ExprKind } from "./expression/ExprKind.js";
|
|
26
|
-
import { TypeManager } from "./
|
|
27
|
-
export { IfcElementAccessor, IfcExpressionContext, Value, StringValue, BooleanValue, LogicalValue, NumericValue, ExpressionValue, ReferenceValue, IfcPropertySetAccessor, IfcPropertyAccessor, IfcRootObjectAccessor, IfcTypeObjectAccessor, NamedObjectAccessor, ObjectAccessor, Expr,
|
|
26
|
+
import { TypeManager } from "./compiler/TypeManager.js";
|
|
27
|
+
export { IfcElementAccessor, IfcExpressionContext, Value, StringValue, BooleanValue, LogicalValue, NumericValue, ExpressionValue, ReferenceValue, IfcPropertySetAccessor, IfcPropertyAccessor, IfcRootObjectAccessor, IfcTypeObjectAccessor, NamedObjectAccessor, ObjectAccessor, Expr, ExprCompiler, ExprKind, IfcExpressionEvaluationException, IfcExpressionErrorListener, IfcExpressionVisitor, isPresent, isNullish, ExprEvalResult, ExprEvalError, isExprEvalError, isExprEvalSuccess, };
|
|
28
28
|
export type { BoxedValueTypes };
|
|
29
29
|
export declare class IfcExpressionParseResult {
|
|
30
|
+
private readonly _input;
|
|
30
31
|
private readonly _typeManager;
|
|
31
32
|
private readonly _parseTree;
|
|
32
|
-
constructor(typeManager: TypeManager, exprContext: any);
|
|
33
|
+
constructor(input: string, typeManager: TypeManager, exprContext: any);
|
|
33
34
|
get typeManager(): TypeManager;
|
|
34
35
|
get parseTree(): ParserRuleContext;
|
|
36
|
+
get input(): string;
|
|
35
37
|
}
|
|
36
38
|
export declare class IfcExpression {
|
|
39
|
+
/**
|
|
40
|
+
* Parses the input and returns a parse result, which contains the parse tree, the type information per parse tree node, and the input.
|
|
41
|
+
* @param input
|
|
42
|
+
* @param errorListener
|
|
43
|
+
* @return the parse result, which can subequently be compiled into an Expr using compile().
|
|
44
|
+
*/
|
|
37
45
|
static parse(input: string, errorListener?: ErrorListener<Token | number>): IfcExpressionParseResult;
|
|
38
|
-
|
|
46
|
+
/**
|
|
47
|
+
* Compiles the specified parseResult into an Expr.
|
|
48
|
+
* @param parseResult
|
|
49
|
+
* @return the Expression (Expr), which can be evaluated to obtain its result.
|
|
50
|
+
*/
|
|
51
|
+
static compile(parseResult: IfcExpressionParseResult): Expr<ExpressionValue>;
|
|
52
|
+
/**
|
|
53
|
+
* Evaluates the specified input expression and returns the evaluation result. The parse
|
|
54
|
+
* and compile steps are done internally.
|
|
55
|
+
*
|
|
56
|
+
* @param expression: the input expression
|
|
57
|
+
* @param context: the context required for accessing the IFC model
|
|
58
|
+
* @return the result (or an error object).
|
|
59
|
+
*/
|
|
39
60
|
static evaluate(expression: string, context?: IfcExpressionContext): ExprEvalResult<ExpressionValue>;
|
|
61
|
+
static formatError(input: string, error: ExprEvalError): string;
|
|
62
|
+
private static indent;
|
|
63
|
+
static evaluateExpression(expr: Expr<ExpressionValue>, context?: IfcExpressionContext): ExprEvalResult<ExpressionValue>;
|
|
40
64
|
}
|
|
@@ -3,14 +3,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.IfcExpression = exports.IfcExpressionParseResult = exports.isExprEvalSuccess = exports.isExprEvalError = exports.isNullish = exports.isPresent = exports.IfcExpressionVisitor = exports.IfcExpressionErrorListener = exports.IfcExpressionEvaluationException = exports.ExprKind = exports.
|
|
6
|
+
exports.IfcExpression = exports.IfcExpressionParseResult = exports.isExprEvalSuccess = exports.isExprEvalError = exports.isNullish = exports.isPresent = exports.IfcExpressionVisitor = exports.IfcExpressionErrorListener = exports.IfcExpressionEvaluationException = exports.ExprKind = exports.ExprCompiler = exports.NamedObjectAccessor = exports.IfcTypeObjectAccessor = exports.IfcRootObjectAccessor = exports.IfcPropertyAccessor = exports.IfcPropertySetAccessor = exports.ReferenceValue = exports.NumericValue = exports.LogicalValue = exports.BooleanValue = exports.StringValue = exports.IfcElementAccessor = void 0;
|
|
7
7
|
const antlr4_1 = require("antlr4");
|
|
8
|
-
const
|
|
9
|
-
Object.defineProperty(exports, "
|
|
8
|
+
const ExprCompiler_js_1 = require("./compiler/ExprCompiler.js");
|
|
9
|
+
Object.defineProperty(exports, "ExprCompiler", { enumerable: true, get: function () { return ExprCompiler_js_1.ExprCompiler; } });
|
|
10
10
|
const IfcExpressionErrorListener_js_1 = require("./IfcExpressionErrorListener.js");
|
|
11
11
|
Object.defineProperty(exports, "IfcExpressionErrorListener", { enumerable: true, get: function () { return IfcExpressionErrorListener_js_1.IfcExpressionErrorListener; } });
|
|
12
|
-
const IfcExpressionValidationListener_js_1 = require("./IfcExpressionValidationListener.js");
|
|
13
|
-
const IfcExpressionUtils_js_1 = require("./IfcExpressionUtils.js");
|
|
12
|
+
const IfcExpressionValidationListener_js_1 = require("./compiler/IfcExpressionValidationListener.js");
|
|
13
|
+
const IfcExpressionUtils_js_1 = require("./util/IfcExpressionUtils.js");
|
|
14
14
|
Object.defineProperty(exports, "isNullish", { enumerable: true, get: function () { return IfcExpressionUtils_js_1.isNullish; } });
|
|
15
15
|
Object.defineProperty(exports, "isPresent", { enumerable: true, get: function () { return IfcExpressionUtils_js_1.isPresent; } });
|
|
16
16
|
const IfcElementAccessor_js_1 = require("./context/IfcElementAccessor.js");
|
|
@@ -49,10 +49,12 @@ Object.defineProperty(exports, "ExprKind", { enumerable: true, get: function ()
|
|
|
49
49
|
const ValidationException_js_1 = require("./error/ValidationException.js");
|
|
50
50
|
const ExceptionToExprEvalErrorMapper_js_1 = require("./error/ExceptionToExprEvalErrorMapper.js");
|
|
51
51
|
const NopContext_js_1 = require("./context/NopContext.js");
|
|
52
|
+
const ExprToTextInputLinker_1 = require("./compiler/ExprToTextInputLinker");
|
|
52
53
|
class IfcExpressionParseResult {
|
|
53
|
-
constructor(typeManager, exprContext) {
|
|
54
|
+
constructor(input, typeManager, exprContext) {
|
|
54
55
|
this._typeManager = typeManager;
|
|
55
56
|
this._parseTree = exprContext;
|
|
57
|
+
this._input = input;
|
|
56
58
|
}
|
|
57
59
|
get typeManager() {
|
|
58
60
|
return this._typeManager;
|
|
@@ -60,9 +62,18 @@ class IfcExpressionParseResult {
|
|
|
60
62
|
get parseTree() {
|
|
61
63
|
return this._parseTree;
|
|
62
64
|
}
|
|
65
|
+
get input() {
|
|
66
|
+
return this._input;
|
|
67
|
+
}
|
|
63
68
|
}
|
|
64
69
|
exports.IfcExpressionParseResult = IfcExpressionParseResult;
|
|
65
70
|
class IfcExpression {
|
|
71
|
+
/**
|
|
72
|
+
* Parses the input and returns a parse result, which contains the parse tree, the type information per parse tree node, and the input.
|
|
73
|
+
* @param input
|
|
74
|
+
* @param errorListener
|
|
75
|
+
* @return the parse result, which can subequently be compiled into an Expr using compile().
|
|
76
|
+
*/
|
|
66
77
|
static parse(input, errorListener) {
|
|
67
78
|
const chars = new antlr4_1.CharStream(input); // replace this with a FileStream as required
|
|
68
79
|
const lexer = new IfcExpressionLexer_js_1.default(chars);
|
|
@@ -93,12 +104,27 @@ class IfcExpression {
|
|
|
93
104
|
}
|
|
94
105
|
}
|
|
95
106
|
}
|
|
96
|
-
return new IfcExpressionParseResult(validationListener.getTypeManager(), expr);
|
|
107
|
+
return new IfcExpressionParseResult(input, validationListener.getTypeManager(), expr);
|
|
97
108
|
}
|
|
109
|
+
/**
|
|
110
|
+
* Compiles the specified parseResult into an Expr.
|
|
111
|
+
* @param parseResult
|
|
112
|
+
* @return the Expression (Expr), which can be evaluated to obtain its result.
|
|
113
|
+
*/
|
|
98
114
|
static compile(parseResult) {
|
|
99
|
-
const
|
|
100
|
-
|
|
115
|
+
const compiler = new ExprCompiler_js_1.ExprCompiler(parseResult.typeManager);
|
|
116
|
+
const expr = compiler.visit(parseResult.parseTree);
|
|
117
|
+
ExprToTextInputLinker_1.ExprToTextInputLinker.linkTextToExpressions(parseResult.input, expr, compiler.getExprManager());
|
|
118
|
+
return expr;
|
|
101
119
|
}
|
|
120
|
+
/**
|
|
121
|
+
* Evaluates the specified input expression and returns the evaluation result. The parse
|
|
122
|
+
* and compile steps are done internally.
|
|
123
|
+
*
|
|
124
|
+
* @param expression: the input expression
|
|
125
|
+
* @param context: the context required for accessing the IFC model
|
|
126
|
+
* @return the result (or an error object).
|
|
127
|
+
*/
|
|
102
128
|
static evaluate(expression, context = new NopContext_js_1.NopContext()) {
|
|
103
129
|
const errorListener = new IfcExpressionErrorListener_js_1.IfcExpressionErrorListener();
|
|
104
130
|
const parseResult = IfcExpression.parse(expression, errorListener);
|
|
@@ -108,6 +134,35 @@ class IfcExpression {
|
|
|
108
134
|
const compiledExpression = this.compile(parseResult);
|
|
109
135
|
return compiledExpression.evaluate(context, new Map());
|
|
110
136
|
}
|
|
137
|
+
static formatError(input, error) {
|
|
138
|
+
const lines = ["** Error **"];
|
|
139
|
+
if (!(0, IfcExpressionUtils_js_1.isNullish)(error["textSpan"])) {
|
|
140
|
+
const span = error["textSpan"];
|
|
141
|
+
const underlined = span.underline(input, "^");
|
|
142
|
+
const startString = "Input: ";
|
|
143
|
+
const indented = this.indent(underlined, startString.length);
|
|
144
|
+
const replaced = startString + indented.substr(startString.length);
|
|
145
|
+
replaced.split("\n").forEach((line) => lines.push(line));
|
|
146
|
+
}
|
|
147
|
+
lines.push("Problem: " + error.message);
|
|
148
|
+
return lines.join("\n");
|
|
149
|
+
}
|
|
150
|
+
static indent(s, by) {
|
|
151
|
+
return s
|
|
152
|
+
.split("\n")
|
|
153
|
+
.map((line) => " ".repeat(by) + line)
|
|
154
|
+
.join("\n");
|
|
155
|
+
}
|
|
156
|
+
static evaluateExpression(expr, context = new NopContext_js_1.NopContext()) {
|
|
157
|
+
if ((0, IfcExpressionUtils_js_1.isNullish)(expr.getTextSpan())) {
|
|
158
|
+
// if the expr was created by parsing an input, it has a textSpan set.
|
|
159
|
+
// If the expr was created programmatically, we have to generate its exprString once, which causes its
|
|
160
|
+
// textspan to be set.
|
|
161
|
+
// make sure we know the position
|
|
162
|
+
expr.toExprString();
|
|
163
|
+
}
|
|
164
|
+
return expr.evaluate(context, new Map());
|
|
165
|
+
}
|
|
111
166
|
}
|
|
112
167
|
exports.IfcExpression = IfcExpression;
|
|
113
168
|
//# sourceMappingURL=IfcExpression.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/IfcExpression.ts"],"names":[],"mappings":"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","file":"IfcExpression.js","sourcesContent":["import {\n CharStream,\n CommonTokenStream,\n ErrorListener,\n ParserRuleContext,\n ParseTreeWalker,\n Token,\n} from \"antlr4\";\nimport { ExprVisitor } from \"./ExprVisitor.js\";\nimport { IfcExpressionErrorListener } from \"./IfcExpressionErrorListener.js\";\nimport { IfcExpressionValidationListener } from \"./IfcExpressionValidationListener.js\";\n\nimport { isNullish, isPresent } from \"./IfcExpressionUtils.js\";\nimport { IfcExpressionContext } from \"./context/IfcExpressionContext.js\";\nimport { Expr } from \"./expression/Expr.js\";\n\nimport { IfcElementAccessor } from \"./context/IfcElementAccessor.js\";\nimport { Value } from \"./value/Value.js\";\nimport { StringValue } from \"./value/StringValue.js\";\nimport { NumericValue } from \"./value/NumericValue.js\";\nimport { BooleanValue } from \"./value/BooleanValue.js\";\nimport { LogicalValue } from \"./value/LogicalValue.js\";\nimport { ReferenceValue } from \"./value/ReferenceValue.js\";\nimport { IfcPropertySetAccessor } from \"./context/IfcPropertySetAccessor.js\";\nimport { IfcPropertyAccessor } from \"./context/IfcPropertyAccessor.js\";\nimport { IfcRootObjectAccessor } from \"./context/IfcRootObjectAccessor.js\";\nimport { IfcTypeObjectAccessor } from \"./context/IfcTypeObjectAccessor.js\";\nimport { NamedObjectAccessor } from \"./context/NamedObjectAccessor.js\";\nimport IfcExpressionParser from \"./gen/parser/IfcExpressionParser.js\";\nimport IfcExpressionVisitor from \"./gen/parser/IfcExpressionVisitor.js\";\nimport IfcExpressionLexer from \"./gen/parser/IfcExpressionLexer.js\";\nimport { ObjectAccessor } from \"./context/ObjectAccessor.js\";\nimport { IfcExpressionEvaluationException } from \"./expression/IfcExpressionEvaluationException.js\";\nimport type { ExpressionValue } from \"./value/ExpressionValue.js\";\nimport type { BoxedValueTypes } from \"./value/BoxedValueTypes.js\";\nimport {\n ExprEvalError,\n ExprEvalResult,\n isExprEvalError,\n isExprEvalSuccess,\n} from \"./expression/ExprEvalResult.js\";\nimport { ExprKind } from \"./expression/ExprKind.js\";\nimport { ValidationException } from \"./error/ValidationException.js\";\nimport { TypeManager } from \"./type/TypeManager.js\";\nimport { mapException } from \"./error/ExceptionToExprEvalErrorMapper.js\";\nimport { NopContext } from \"./context/NopContext.js\";\n\nexport {\n IfcElementAccessor,\n IfcExpressionContext,\n Value,\n StringValue,\n BooleanValue,\n LogicalValue,\n NumericValue,\n ExpressionValue,\n ReferenceValue,\n IfcPropertySetAccessor,\n IfcPropertyAccessor,\n IfcRootObjectAccessor,\n IfcTypeObjectAccessor,\n NamedObjectAccessor,\n ObjectAccessor,\n Expr,\n ExprVisitor,\n ExprKind,\n IfcExpressionEvaluationException,\n IfcExpressionErrorListener,\n IfcExpressionVisitor,\n isPresent,\n isNullish,\n ExprEvalResult,\n ExprEvalError,\n isExprEvalError,\n isExprEvalSuccess,\n};\n\nexport type { BoxedValueTypes };\n\nexport class IfcExpressionParseResult {\n private readonly _typeManager: TypeManager;\n private readonly _parseTree: ParserRuleContext;\n\n constructor(typeManager: TypeManager, exprContext) {\n this._typeManager = typeManager;\n this._parseTree = exprContext;\n }\n\n get typeManager(): TypeManager {\n return this._typeManager;\n }\n\n get parseTree(): ParserRuleContext {\n return this._parseTree;\n }\n}\n\nexport class IfcExpression {\n public static parse(\n input: string,\n errorListener?: ErrorListener<Token | number>\n ): IfcExpressionParseResult {\n const chars = new CharStream(input); // replace this with a FileStream as required\n const lexer = new IfcExpressionLexer(chars);\n const tokens = new CommonTokenStream(lexer);\n const parser = new IfcExpressionParser(tokens);\n lexer.removeErrorListeners();\n parser.removeErrorListeners();\n const myErrorListener = new IfcExpressionErrorListener();\n if (isPresent(errorListener)) {\n lexer.addErrorListener(errorListener);\n parser.addErrorListener(errorListener);\n }\n lexer.addErrorListener(myErrorListener);\n parser.addErrorListener(myErrorListener);\n const expr = parser.expr();\n const validationListener = new IfcExpressionValidationListener();\n if (!myErrorListener.isErrorOccurred()) {\n const walker = new ParseTreeWalker();\n try {\n walker.walk(validationListener, expr);\n } catch (e) {\n if (e instanceof ValidationException) {\n if (errorListener instanceof IfcExpressionErrorListener) {\n errorListener.validationException(e);\n }\n myErrorListener.validationException(e);\n }\n }\n }\n return new IfcExpressionParseResult(\n validationListener.getTypeManager(),\n expr\n );\n }\n\n private static compile(\n parseResult: IfcExpressionParseResult\n ): Expr<ExpressionValue> {\n const visitor = new ExprVisitor(parseResult.typeManager);\n return visitor.visit(parseResult.parseTree);\n }\n\n public static evaluate(\n expression: string,\n context: IfcExpressionContext = new NopContext()\n ): ExprEvalResult<ExpressionValue> {\n const errorListener = new IfcExpressionErrorListener();\n const parseResult = IfcExpression.parse(expression, errorListener);\n if (errorListener.isErrorOccurred()) {\n return mapException(errorListener.getException());\n }\n const compiledExpression = this.compile(parseResult);\n return compiledExpression.evaluate(context, new Map<string, any>());\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/IfcExpression.ts"],"names":[],"mappings":"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","file":"IfcExpression.js","sourcesContent":["import {\n CharStream,\n CommonTokenStream,\n ErrorListener,\n ParserRuleContext,\n ParseTreeWalker,\n Token,\n} from \"antlr4\";\nimport { ExprCompiler } from \"./compiler/ExprCompiler.js\";\nimport { IfcExpressionErrorListener } from \"./IfcExpressionErrorListener.js\";\nimport { IfcExpressionValidationListener } from \"./compiler/IfcExpressionValidationListener.js\";\n\nimport { isNullish, isPresent } from \"./util/IfcExpressionUtils.js\";\nimport { IfcExpressionContext } from \"./context/IfcExpressionContext.js\";\nimport { Expr } from \"./expression/Expr.js\";\n\nimport { IfcElementAccessor } from \"./context/IfcElementAccessor.js\";\nimport { Value } from \"./value/Value.js\";\nimport { StringValue } from \"./value/StringValue.js\";\nimport { NumericValue } from \"./value/NumericValue.js\";\nimport { BooleanValue } from \"./value/BooleanValue.js\";\nimport { LogicalValue } from \"./value/LogicalValue.js\";\nimport { ReferenceValue } from \"./value/ReferenceValue.js\";\nimport { IfcPropertySetAccessor } from \"./context/IfcPropertySetAccessor.js\";\nimport { IfcPropertyAccessor } from \"./context/IfcPropertyAccessor.js\";\nimport { IfcRootObjectAccessor } from \"./context/IfcRootObjectAccessor.js\";\nimport { IfcTypeObjectAccessor } from \"./context/IfcTypeObjectAccessor.js\";\nimport { NamedObjectAccessor } from \"./context/NamedObjectAccessor.js\";\nimport IfcExpressionParser from \"./gen/parser/IfcExpressionParser.js\";\nimport IfcExpressionVisitor from \"./gen/parser/IfcExpressionVisitor.js\";\nimport IfcExpressionLexer from \"./gen/parser/IfcExpressionLexer.js\";\nimport { ObjectAccessor } from \"./context/ObjectAccessor.js\";\nimport { IfcExpressionEvaluationException } from \"./expression/IfcExpressionEvaluationException.js\";\nimport type { ExpressionValue } from \"./value/ExpressionValue.js\";\nimport type { BoxedValueTypes } from \"./value/BoxedValueTypes.js\";\nimport {\n ExprEvalConsequentialError1Obj,\n ExprEvalError,\n ExprEvalResult,\n isExprEvalError,\n isExprEvalSuccess,\n} from \"./expression/ExprEvalResult.js\";\nimport { ExprKind } from \"./expression/ExprKind.js\";\nimport { ValidationException } from \"./error/ValidationException.js\";\nimport { TypeManager } from \"./compiler/TypeManager.js\";\nimport { mapException } from \"./error/ExceptionToExprEvalErrorMapper.js\";\nimport { NopContext } from \"./context/NopContext.js\";\nimport { ExprToTextInputLinker } from \"./compiler/ExprToTextInputLinker\";\nimport { TextSpan } from \"./util/TextSpan\";\n\nexport {\n IfcElementAccessor,\n IfcExpressionContext,\n Value,\n StringValue,\n BooleanValue,\n LogicalValue,\n NumericValue,\n ExpressionValue,\n ReferenceValue,\n IfcPropertySetAccessor,\n IfcPropertyAccessor,\n IfcRootObjectAccessor,\n IfcTypeObjectAccessor,\n NamedObjectAccessor,\n ObjectAccessor,\n Expr,\n ExprCompiler,\n ExprKind,\n IfcExpressionEvaluationException,\n IfcExpressionErrorListener,\n IfcExpressionVisitor,\n isPresent,\n isNullish,\n ExprEvalResult,\n ExprEvalError,\n isExprEvalError,\n isExprEvalSuccess,\n};\n\nexport type { BoxedValueTypes };\n\nexport class IfcExpressionParseResult {\n private readonly _input: string;\n private readonly _typeManager: TypeManager;\n private readonly _parseTree: ParserRuleContext;\n\n constructor(input: string, typeManager: TypeManager, exprContext) {\n this._typeManager = typeManager;\n this._parseTree = exprContext;\n this._input = input;\n }\n\n get typeManager(): TypeManager {\n return this._typeManager;\n }\n\n get parseTree(): ParserRuleContext {\n return this._parseTree;\n }\n\n get input(): string {\n return this._input;\n }\n}\n\nexport class IfcExpression {\n /**\n * Parses the input and returns a parse result, which contains the parse tree, the type information per parse tree node, and the input.\n * @param input\n * @param errorListener\n * @return the parse result, which can subequently be compiled into an Expr using compile().\n */\n public static parse(\n input: string,\n errorListener?: ErrorListener<Token | number>\n ): IfcExpressionParseResult {\n const chars = new CharStream(input); // replace this with a FileStream as required\n const lexer = new IfcExpressionLexer(chars);\n const tokens = new CommonTokenStream(lexer);\n const parser = new IfcExpressionParser(tokens);\n lexer.removeErrorListeners();\n parser.removeErrorListeners();\n const myErrorListener = new IfcExpressionErrorListener();\n if (isPresent(errorListener)) {\n lexer.addErrorListener(errorListener);\n parser.addErrorListener(errorListener);\n }\n lexer.addErrorListener(myErrorListener);\n parser.addErrorListener(myErrorListener);\n const expr = parser.expr();\n const validationListener = new IfcExpressionValidationListener();\n if (!myErrorListener.isErrorOccurred()) {\n const walker = new ParseTreeWalker();\n try {\n walker.walk(validationListener, expr);\n } catch (e) {\n if (e instanceof ValidationException) {\n if (errorListener instanceof IfcExpressionErrorListener) {\n errorListener.validationException(e);\n }\n myErrorListener.validationException(e);\n }\n }\n }\n return new IfcExpressionParseResult(\n input,\n validationListener.getTypeManager(),\n expr\n );\n }\n\n /**\n * Compiles the specified parseResult into an Expr.\n * @param parseResult\n * @return the Expression (Expr), which can be evaluated to obtain its result.\n */\n public static compile(\n parseResult: IfcExpressionParseResult\n ): Expr<ExpressionValue> {\n const compiler = new ExprCompiler(parseResult.typeManager);\n const expr = compiler.visit(parseResult.parseTree);\n ExprToTextInputLinker.linkTextToExpressions(\n parseResult.input,\n expr,\n compiler.getExprManager()\n );\n return expr;\n }\n\n /**\n * Evaluates the specified input expression and returns the evaluation result. The parse\n * and compile steps are done internally.\n *\n * @param expression: the input expression\n * @param context: the context required for accessing the IFC model\n * @return the result (or an error object).\n */\n public static evaluate(\n expression: string,\n context: IfcExpressionContext = new NopContext()\n ): ExprEvalResult<ExpressionValue> {\n const errorListener = new IfcExpressionErrorListener();\n const parseResult = IfcExpression.parse(expression, errorListener);\n if (errorListener.isErrorOccurred()) {\n return mapException(errorListener.getException());\n }\n const compiledExpression = this.compile(parseResult);\n return compiledExpression.evaluate(context, new Map<string, any>());\n }\n\n public static formatError(input: string, error: ExprEvalError) {\n const lines = [\"** Error **\"];\n if (!isNullish(error[\"textSpan\"])) {\n const span: TextSpan = error[\"textSpan\"];\n const underlined = span.underline(input, \"^\");\n const startString = \"Input: \";\n const indented = this.indent(underlined, startString.length);\n const replaced = startString + indented.substr(startString.length);\n replaced.split(\"\\n\").forEach((line) => lines.push(line));\n }\n lines.push(\"Problem: \" + error.message);\n return lines.join(\"\\n\");\n }\n\n private static indent(s: string, by: number) {\n return s\n .split(\"\\n\")\n .map((line) => \" \".repeat(by) + line)\n .join(\"\\n\");\n }\n\n public static evaluateExpression(\n expr: Expr<ExpressionValue>,\n context: IfcExpressionContext = new NopContext()\n ) {\n if (isNullish(expr.getTextSpan())) {\n // if the expr was created by parsing an input, it has a textSpan set.\n // If the expr was created programmatically, we have to generate its exprString once, which causes its\n // textspan to be set.\n // make sure we know the position\n expr.toExprString();\n }\n return expr.evaluate(context, new Map());\n }\n}\n"]}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.IfcExpressionErrorListener = void 0;
|
|
4
4
|
const antlr4_1 = require("antlr4");
|
|
5
|
-
const IfcExpressionUtils_js_1 = require("./IfcExpressionUtils.js");
|
|
5
|
+
const IfcExpressionUtils_js_1 = require("./util/IfcExpressionUtils.js");
|
|
6
6
|
const SyntaxErrorException_js_1 = require("./error/SyntaxErrorException.js");
|
|
7
7
|
class IfcExpressionErrorListener extends antlr4_1.ErrorListener {
|
|
8
8
|
validationException(validationException) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/IfcExpressionErrorListener.ts"],"names":[],"mappings":";;;AAAA,mCAAgF;AAChF,
|
|
1
|
+
{"version":3,"sources":["../../src/IfcExpressionErrorListener.ts"],"names":[],"mappings":";;;AAAA,mCAAgF;AAChF,wEAAoE;AACpE,6EAAuE;AAGvE,MAAa,0BAA2B,SAAQ,sBAA6B;IAG3E,mBAAmB,CAAC,mBAAwC;QAC1D,IAAI,CAAC,SAAS,GAAG,mBAAmB,CAAC;IACvC,CAAC;IAED,WAAW,CACT,UAAsC,EACtC,eAA+B,EAC/B,IAAY,EACZ,MAAc,EACd,GAAW,EACX,CAAmC;QAEnC,IAAI,OAAO,eAAe,KAAK,QAAQ,EAAE;YACvC,IAAI,CAAC,SAAS,GAAG,IAAI,8CAAoB,CACvC,eAAe,EACf,IAAI,EACJ,MAAM,EACN,GAAG,CACJ,CAAC;SACH;aAAM;YACL,IAAI,CAAC,SAAS,GAAG,IAAI,8CAAoB,CACvC,IAAA,iCAAS,EAAC,eAAe,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,EACjE,IAAI,EACJ,MAAM,EACN,GAAG,CACJ,CAAC;SACH;IACH,CAAC;IAEM,eAAe;QACpB,OAAO,IAAA,iCAAS,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC;IAEM,YAAY;QACjB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;CACF;AAvCD,gEAuCC","file":"IfcExpressionErrorListener.js","sourcesContent":["import { ErrorListener, RecognitionException, Recognizer, Token } from \"antlr4\";\nimport { isNullish, isPresent } from \"./util/IfcExpressionUtils.js\";\nimport { SyntaxErrorException } from \"./error/SyntaxErrorException.js\";\nimport { ValidationException } from \"./error/ValidationException.js\";\n\nexport class IfcExpressionErrorListener extends ErrorListener<Token | number> {\n private exception: SyntaxErrorException | ValidationException;\n\n validationException(validationException: ValidationException) {\n this.exception = validationException;\n }\n\n syntaxError(\n recognizer: Recognizer<Token | number>,\n offendingSymbol: Token | number,\n line: number,\n column: number,\n msg: string,\n e: RecognitionException | undefined\n ) {\n if (typeof offendingSymbol === \"number\") {\n this.exception = new SyntaxErrorException(\n offendingSymbol,\n line,\n column,\n msg\n );\n } else {\n this.exception = new SyntaxErrorException(\n isNullish(offendingSymbol) ? \"[no symbol]\" : offendingSymbol.text,\n line,\n column,\n msg\n );\n }\n }\n\n public isErrorOccurred(): boolean {\n return isPresent(this.exception);\n }\n\n public getException(): SyntaxErrorException | ValidationException {\n return this.exception;\n }\n}\n"]}
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ExprCompiler = void 0;
|
|
7
|
+
const IfcExpressionVisitor_js_1 = __importDefault(require("../gen/parser/IfcExpressionVisitor.js"));
|
|
8
|
+
const NumericLiteralExpr_js_1 = require("../expression/numeric/NumericLiteralExpr.js");
|
|
9
|
+
const IfcExpressionUtils_js_1 = require("../util/IfcExpressionUtils.js");
|
|
10
|
+
const decimal_js_1 = __importDefault(require("decimal.js"));
|
|
11
|
+
const PlusExpr_js_1 = require("../expression/numeric/PlusExpr.js");
|
|
12
|
+
const MinusExpr_js_1 = require("../expression/numeric/MinusExpr.js");
|
|
13
|
+
const MultiplyExpr_js_1 = require("../expression/numeric/MultiplyExpr.js");
|
|
14
|
+
const DivideExpr_js_1 = require("../expression/numeric/DivideExpr.js");
|
|
15
|
+
const PropObjectReferenceExpr_js_1 = require("../expression/reference/PropObjectReferenceExpr.js");
|
|
16
|
+
const ElemObjectReferenceExpr_js_1 = require("../expression/reference/ElemObjectReferenceExpr.js");
|
|
17
|
+
const StringLiteralExpr_js_1 = require("../expression/string/StringLiteralExpr.js");
|
|
18
|
+
const ArrayExpr_js_1 = require("../expression/structure/ArrayExpr.js");
|
|
19
|
+
const FunctionExpr_js_1 = require("../expression/function/FunctionExpr.js");
|
|
20
|
+
const PowerExpr_js_1 = require("../expression/numeric/PowerExpr.js");
|
|
21
|
+
const UnaryMinusExpr_js_1 = require("../expression/numeric/UnaryMinusExpr.js");
|
|
22
|
+
const AndExpr_js_1 = require("../expression/boolean/AndExpr.js");
|
|
23
|
+
const BooleanLiteralExpr_js_1 = require("../expression/boolean/BooleanLiteralExpr.js");
|
|
24
|
+
const OrExpr_js_1 = require("../expression/boolean/OrExpr.js");
|
|
25
|
+
const XorExpr_js_1 = require("../expression/boolean/XorExpr.js");
|
|
26
|
+
const SyntaxErrorException_js_1 = require("../error/SyntaxErrorException.js");
|
|
27
|
+
const NotExpr_js_1 = require("../expression/boolean/NotExpr.js");
|
|
28
|
+
const ParenthesisExpr_js_1 = require("../expression/structure/ParenthesisExpr.js");
|
|
29
|
+
const EqualsExpr_js_1 = require("../expression/comparison/EqualsExpr.js");
|
|
30
|
+
const NotEqualsExpr_js_1 = require("../expression/comparison/NotEqualsExpr.js");
|
|
31
|
+
const StringConcatExpr_js_1 = require("../expression/string/StringConcatExpr.js");
|
|
32
|
+
const PlusOrConcatExpr_js_1 = require("../expression/poly/PlusOrConcatExpr.js");
|
|
33
|
+
const ExpressionTypeError_js_1 = require("../error/ExpressionTypeError.js");
|
|
34
|
+
const GreaterThan_js_1 = require("../expression/comparison/GreaterThan.js");
|
|
35
|
+
const GreaterThanOrEqual_js_1 = require("../expression/comparison/GreaterThanOrEqual.js");
|
|
36
|
+
const LessThan_js_1 = require("../expression/comparison/LessThan.js");
|
|
37
|
+
const LessThanOrEqual_js_1 = require("../expression/comparison/LessThanOrEqual.js");
|
|
38
|
+
const ExprManager_js_1 = require("./ExprManager.js");
|
|
39
|
+
class ExprCompiler extends IfcExpressionVisitor_js_1.default {
|
|
40
|
+
constructor(typeManager) {
|
|
41
|
+
super();
|
|
42
|
+
this.methodCallTargetStack = [];
|
|
43
|
+
this.visitExpr = (ctx) => {
|
|
44
|
+
return this.visit(ctx.singleExpr());
|
|
45
|
+
};
|
|
46
|
+
this.visitVariableRef = (ctx) => {
|
|
47
|
+
if (ctx.IDENTIFIER().getText().toUpperCase() === "PROPERTY") {
|
|
48
|
+
return this.associateContextAndReturn(new PropObjectReferenceExpr_js_1.PropObjectReferenceExpr(), ctx);
|
|
49
|
+
}
|
|
50
|
+
else if (ctx.IDENTIFIER().getText().toUpperCase() === "ELEMENT") {
|
|
51
|
+
return this.associateContextAndReturn(new ElemObjectReferenceExpr_js_1.ElemObjectReferenceExpr(), ctx);
|
|
52
|
+
}
|
|
53
|
+
throw new Error(`Parsing error: No variable '${ctx.getText()}' found `);
|
|
54
|
+
};
|
|
55
|
+
this.visitSEComparison = (ctx) => {
|
|
56
|
+
const left = this.visit(ctx.singleExpr(0));
|
|
57
|
+
const right = this.visit(ctx.singleExpr(1));
|
|
58
|
+
switch (ctx.CMP_OP().getText()) {
|
|
59
|
+
case "==":
|
|
60
|
+
return this.associateContextAndReturn(new EqualsExpr_js_1.EqualsExpr(left, right), ctx);
|
|
61
|
+
case "!=":
|
|
62
|
+
return this.associateContextAndReturn(new NotEqualsExpr_js_1.NotEqualsExpr(left, right), ctx);
|
|
63
|
+
case ">":
|
|
64
|
+
return this.associateContextAndReturn(new GreaterThan_js_1.GreaterThan(left, right), ctx);
|
|
65
|
+
case ">=":
|
|
66
|
+
return this.associateContextAndReturn(new GreaterThanOrEqual_js_1.GreaterThanOrEqual(left, right), ctx);
|
|
67
|
+
case "<":
|
|
68
|
+
return this.associateContextAndReturn(new LessThan_js_1.LessThan(left, right), ctx);
|
|
69
|
+
case "<=":
|
|
70
|
+
return this.associateContextAndReturn(new LessThanOrEqual_js_1.LessThanOrEqual(left, right), ctx);
|
|
71
|
+
}
|
|
72
|
+
throw new Error(`Parsing error: comparison operator '${ctx
|
|
73
|
+
.CMP_OP()
|
|
74
|
+
.getText()}' not supported`);
|
|
75
|
+
};
|
|
76
|
+
this.visitSEMethodCall = (ctx) => {
|
|
77
|
+
this.methodCallTargetStack.push(this.visit(ctx.singleExpr()));
|
|
78
|
+
return this.visit(ctx.methodCallChain());
|
|
79
|
+
};
|
|
80
|
+
this.visitSELiteral = (ctx) => {
|
|
81
|
+
return this.visit(ctx.literal());
|
|
82
|
+
};
|
|
83
|
+
this.visitSEVariableRef = (ctx) => {
|
|
84
|
+
return this.visit(ctx.variableRef());
|
|
85
|
+
};
|
|
86
|
+
this.visitSEArrayExpr = (ctx) => {
|
|
87
|
+
return this.visit(ctx.arrayExpr());
|
|
88
|
+
};
|
|
89
|
+
this.visitSEFunctionCall = (ctx) => {
|
|
90
|
+
return this.visit(ctx.functionCall());
|
|
91
|
+
};
|
|
92
|
+
this.visitSEParenthesis = (ctx) => {
|
|
93
|
+
return this.associateContextAndReturn(new ParenthesisExpr_js_1.ParenthesisExpr(this.visit(ctx._sub)), ctx);
|
|
94
|
+
};
|
|
95
|
+
/*================================================
|
|
96
|
+
* MethodCallChain
|
|
97
|
+
*==============================================*/
|
|
98
|
+
this.visitMethodCallChainInner = (ctx) => {
|
|
99
|
+
const functionExpr = new FunctionExpr_js_1.FunctionExpr(ctx.functionCall().IDENTIFIER().getText(), this.collectFunctionArguments(ctx.functionCall().exprList(), [
|
|
100
|
+
this.methodCallTargetStack.pop(),
|
|
101
|
+
]));
|
|
102
|
+
this.associateContextAndReturn(functionExpr, ctx.functionCall());
|
|
103
|
+
this.methodCallTargetStack.push(functionExpr);
|
|
104
|
+
return this.visit(ctx.methodCallChain());
|
|
105
|
+
};
|
|
106
|
+
this.visitMethodCallChainEnd = (ctx) => {
|
|
107
|
+
return this.associateContextAndReturn(new FunctionExpr_js_1.FunctionExpr(ctx.functionCall().IDENTIFIER().getText(), this.collectFunctionArguments(ctx.functionCall().exprList(), [
|
|
108
|
+
this.methodCallTargetStack.pop(),
|
|
109
|
+
])), ctx.functionCall());
|
|
110
|
+
};
|
|
111
|
+
this.visitSEAddSub = (ctx) => {
|
|
112
|
+
this.typeManager.requireTypesOverlap(ctx._left, ctx._right);
|
|
113
|
+
switch (ctx._op.text) {
|
|
114
|
+
case "+":
|
|
115
|
+
return this.makePlusExpr(ctx);
|
|
116
|
+
case "-":
|
|
117
|
+
return this.associateContextAndReturn(new MinusExpr_js_1.MinusExpr(this.visit(ctx._left), this.visit(ctx._right)), ctx);
|
|
118
|
+
default:
|
|
119
|
+
ExprCompiler.failNode(ctx);
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
this.visitSEMulDiv = (ctx) => {
|
|
123
|
+
switch (ctx._op.text) {
|
|
124
|
+
case "*":
|
|
125
|
+
return this.associateContextAndReturn(new MultiplyExpr_js_1.MultiplyExpr(this.visit(ctx.getChild(0)), this.visit(ctx.getChild(2))), ctx);
|
|
126
|
+
case "/":
|
|
127
|
+
return this.associateContextAndReturn(new DivideExpr_js_1.DivideExpr(this.visit(ctx.getChild(0)), this.visit(ctx.getChild(2))), ctx);
|
|
128
|
+
default:
|
|
129
|
+
ExprCompiler.failNode(ctx);
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
/*================================================
|
|
133
|
+
* StringExpr
|
|
134
|
+
*===============================================*/
|
|
135
|
+
this.visitStringLiteral = (ctx) => {
|
|
136
|
+
const quotedString = ctx.QUOTED_STRING().getText();
|
|
137
|
+
const text = quotedString.substring(1, quotedString.length - 1);
|
|
138
|
+
return this.associateContextAndReturn(new StringLiteralExpr_js_1.StringLiteralExpr(text), ctx);
|
|
139
|
+
};
|
|
140
|
+
/*================================================
|
|
141
|
+
* NumExpr
|
|
142
|
+
*===============================================*/
|
|
143
|
+
this.visitNumLiteral = (ctx) => {
|
|
144
|
+
let val = ctx.INT();
|
|
145
|
+
if ((0, IfcExpressionUtils_js_1.isPresent)(val)) {
|
|
146
|
+
return this.associateContextAndReturn(new NumericLiteralExpr_js_1.NumericLiteralExpr(new decimal_js_1.default(ctx.getText())), ctx);
|
|
147
|
+
}
|
|
148
|
+
val = ctx.FLOAT();
|
|
149
|
+
if ((0, IfcExpressionUtils_js_1.isPresent)(val)) {
|
|
150
|
+
return this.associateContextAndReturn(new NumericLiteralExpr_js_1.NumericLiteralExpr(new decimal_js_1.default(ctx.getText())), ctx);
|
|
151
|
+
}
|
|
152
|
+
ExprCompiler.failNode(ctx);
|
|
153
|
+
};
|
|
154
|
+
this.visitSEUnaryMultipleMinus = (ctx) => {
|
|
155
|
+
return this.visit(ctx.singleExpr());
|
|
156
|
+
};
|
|
157
|
+
this.visitSEPower = (ctx) => {
|
|
158
|
+
return this.associateContextAndReturn(new PowerExpr_js_1.PowerExpr(this.visit(ctx._left), this.visit(ctx._right)), ctx);
|
|
159
|
+
};
|
|
160
|
+
this.visitSEUnaryMinus = (ctx) => {
|
|
161
|
+
return this.associateContextAndReturn(new UnaryMinusExpr_js_1.UnaryMinusExpr(this.visit(ctx.singleExpr())), ctx);
|
|
162
|
+
};
|
|
163
|
+
/*================================================
|
|
164
|
+
* BooleanExpr
|
|
165
|
+
*===============================================*/
|
|
166
|
+
this.visitSEBooleanBinaryOp = (ctx) => {
|
|
167
|
+
switch (ctx._op.text) {
|
|
168
|
+
case "&&":
|
|
169
|
+
return this.associateContextAndReturn(new AndExpr_js_1.AndExpr(this.visit(ctx.singleExpr(0)), this.visit(ctx.singleExpr(1))), ctx);
|
|
170
|
+
case "||":
|
|
171
|
+
return this.associateContextAndReturn(new OrExpr_js_1.OrExpr(this.visit(ctx.singleExpr(0)), this.visit(ctx.singleExpr(1))), ctx);
|
|
172
|
+
case "><":
|
|
173
|
+
return this.associateContextAndReturn(new XorExpr_js_1.XorExpr(this.visit(ctx.singleExpr(0)), this.visit(ctx.singleExpr(1))), ctx);
|
|
174
|
+
}
|
|
175
|
+
throw new SyntaxErrorException_js_1.SyntaxErrorException(ctx._op.text, ctx._op.line, ctx._op.column, `Unknown boolean operator ${ctx._op.text}`);
|
|
176
|
+
};
|
|
177
|
+
this.visitBooleanLiteral = (ctx) => {
|
|
178
|
+
return this.associateContextAndReturn(new BooleanLiteralExpr_js_1.BooleanLiteralExpr(ctx.BOOLEAN().getText().toUpperCase() === "TRUE"), ctx);
|
|
179
|
+
};
|
|
180
|
+
this.visitSENot = (ctx) => {
|
|
181
|
+
return this.associateContextAndReturn(new NotExpr_js_1.NotExpr(this.visit(ctx.singleExpr())), ctx);
|
|
182
|
+
};
|
|
183
|
+
/*================================================
|
|
184
|
+
* ArrayExpr
|
|
185
|
+
*===============================================*/
|
|
186
|
+
this.visitArrayExpr = (ctx) => {
|
|
187
|
+
return this.associateContextAndReturn(new ArrayExpr_js_1.ArrayExpr(this.collectArrayElements(ctx.arrayElementList())), ctx);
|
|
188
|
+
};
|
|
189
|
+
this.collectArrayElements = (ctx) => {
|
|
190
|
+
if (!(0, IfcExpressionUtils_js_1.isNullish)(ctx)) {
|
|
191
|
+
const first = this.visit(ctx.singleExpr());
|
|
192
|
+
const rest = ctx.arrayElementList();
|
|
193
|
+
if (!(0, IfcExpressionUtils_js_1.isNullish)(rest)) {
|
|
194
|
+
const arr = this.collectArrayElements(rest);
|
|
195
|
+
arr.unshift(first);
|
|
196
|
+
return arr;
|
|
197
|
+
}
|
|
198
|
+
return [first];
|
|
199
|
+
}
|
|
200
|
+
return [];
|
|
201
|
+
};
|
|
202
|
+
/*================================================
|
|
203
|
+
* FuncExpr
|
|
204
|
+
*===============================================*/
|
|
205
|
+
this.visitFunctionCall = (ctx) => {
|
|
206
|
+
const args = (0, IfcExpressionUtils_js_1.isNullish)(ctx.exprList())
|
|
207
|
+
? []
|
|
208
|
+
: this.collectFunctionArguments(ctx.exprList());
|
|
209
|
+
return this.associateContextAndReturn(new FunctionExpr_js_1.FunctionExpr(ctx.IDENTIFIER().getText(), args), ctx);
|
|
210
|
+
};
|
|
211
|
+
this.collectFunctionArguments = (ctx, resultSoFar) => {
|
|
212
|
+
if ((0, IfcExpressionUtils_js_1.isNullish)(resultSoFar)) {
|
|
213
|
+
resultSoFar = [];
|
|
214
|
+
}
|
|
215
|
+
if (!(0, IfcExpressionUtils_js_1.isNullish)(ctx)) {
|
|
216
|
+
resultSoFar.push(this.visit(ctx.singleExpr()));
|
|
217
|
+
const rest = ctx.exprList();
|
|
218
|
+
if (!(0, IfcExpressionUtils_js_1.isNullish)(rest)) {
|
|
219
|
+
return this.collectFunctionArguments(rest, resultSoFar);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
return resultSoFar;
|
|
223
|
+
};
|
|
224
|
+
this.visitLiteral = (ctx) => {
|
|
225
|
+
return this.visit(ctx.getChild(0));
|
|
226
|
+
};
|
|
227
|
+
this.typeManager = typeManager;
|
|
228
|
+
this.exprManager = new ExprManager_js_1.ExprManager();
|
|
229
|
+
}
|
|
230
|
+
getExprManager() {
|
|
231
|
+
return this.exprManager;
|
|
232
|
+
}
|
|
233
|
+
/*================================================
|
|
234
|
+
* VariableRef
|
|
235
|
+
*==============================================*/
|
|
236
|
+
associateContextAndReturn(expr, ctx) {
|
|
237
|
+
this.exprManager.registerExprWithContext(expr, ctx);
|
|
238
|
+
return expr;
|
|
239
|
+
}
|
|
240
|
+
makePlusExpr(ctx) {
|
|
241
|
+
if (this.typeManager.isNumeric(ctx._left, ctx._right)) {
|
|
242
|
+
return this.associateContextAndReturn(new PlusExpr_js_1.PlusExpr(this.visit(ctx._left), this.visit(ctx._right)), ctx);
|
|
243
|
+
}
|
|
244
|
+
if (this.typeManager.isString(ctx._left, ctx._right)) {
|
|
245
|
+
return this.associateContextAndReturn(new StringConcatExpr_js_1.StringConcatExpr(this.visit(ctx._left), this.visit(ctx._right)), ctx);
|
|
246
|
+
}
|
|
247
|
+
if (this.typeManager.overlapsWithString(ctx._left, ctx._right) ||
|
|
248
|
+
this.typeManager.overlapsWithNumeric(ctx._left, ctx._right)) {
|
|
249
|
+
return this.associateContextAndReturn(new PlusOrConcatExpr_js_1.PlusOrConcatExpr(this.visit(ctx._left), this.visit(ctx._right)), ctx);
|
|
250
|
+
}
|
|
251
|
+
throw new ExpressionTypeError_js_1.ExpressionTypeError("Operator '+' requires the operands to be either both of type numeric or both of type string, but they are not.", ctx);
|
|
252
|
+
}
|
|
253
|
+
static failNode(ctx) {
|
|
254
|
+
throw new Error(`Cannot parse (sub)expression ${ctx.getText()}`);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
exports.ExprCompiler = ExprCompiler;
|
|
258
|
+
//# sourceMappingURL=ExprCompiler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/compiler/ExprCompiler.ts"],"names":[],"mappings":"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","file":"compiler/ExprCompiler.js","sourcesContent":["import IfcExpressionVisitor from \"../gen/parser/IfcExpressionVisitor.js\";\nimport { NumericLiteralExpr } from \"../expression/numeric/NumericLiteralExpr.js\";\nimport {\n ArrayElementListContext,\n ArrayExprContext,\n BooleanLiteralContext,\n ExprContext,\n ExprListContext,\n FunctionCallContext,\n LiteralContext,\n MethodCallChainEndContext,\n MethodCallChainInnerContext,\n NumLiteralContext,\n SEAddSubContext,\n SEArrayExprContext,\n SEBooleanBinaryOpContext,\n SEComparisonContext,\n SEFunctionCallContext,\n SELiteralContext,\n SEMethodCallContext,\n SEMulDivContext,\n SENotContext,\n SEParenthesisContext,\n SEPowerContext,\n SEUnaryMinusContext,\n SEUnaryMultipleMinusContext,\n SEVariableRefContext,\n StringLiteralContext,\n VariableRefContext,\n} from \"../gen/parser/IfcExpressionParser.js\";\nimport { Expr } from \"../expression/Expr.js\";\nimport { isNullish, isPresent } from \"../util/IfcExpressionUtils.js\";\nimport Decimal from \"decimal.js\";\nimport { PlusExpr } from \"../expression/numeric/PlusExpr.js\";\nimport { MinusExpr } from \"../expression/numeric/MinusExpr.js\";\nimport { ParserRuleContext } from \"antlr4\";\nimport { MultiplyExpr } from \"../expression/numeric/MultiplyExpr.js\";\nimport { DivideExpr } from \"../expression/numeric/DivideExpr.js\";\nimport { PropObjectReferenceExpr } from \"../expression/reference/PropObjectReferenceExpr.js\";\nimport { ElemObjectReferenceExpr } from \"../expression/reference/ElemObjectReferenceExpr.js\";\nimport { StringLiteralExpr } from \"../expression/string/StringLiteralExpr.js\";\nimport { ArrayExpr } from \"../expression/structure/ArrayExpr.js\";\nimport { FunctionExpr } from \"../expression/function/FunctionExpr.js\";\nimport { PowerExpr } from \"../expression/numeric/PowerExpr.js\";\nimport { UnaryMinusExpr } from \"../expression/numeric/UnaryMinusExpr.js\";\nimport { AndExpr } from \"../expression/boolean/AndExpr.js\";\nimport { BooleanLiteralExpr } from \"../expression/boolean/BooleanLiteralExpr.js\";\nimport { OrExpr } from \"../expression/boolean/OrExpr.js\";\nimport { XorExpr } from \"../expression/boolean/XorExpr.js\";\nimport { SyntaxErrorException } from \"../error/SyntaxErrorException.js\";\nimport { NotExpr } from \"../expression/boolean/NotExpr.js\";\nimport { ParenthesisExpr } from \"../expression/structure/ParenthesisExpr.js\";\nimport { EqualsExpr } from \"../expression/comparison/EqualsExpr.js\";\nimport { NotEqualsExpr } from \"../expression/comparison/NotEqualsExpr.js\";\nimport { TypeManager } from \"./TypeManager.js\";\nimport { StringConcatExpr } from \"../expression/string/StringConcatExpr.js\";\nimport { PlusOrConcatExpr } from \"../expression/poly/PlusOrConcatExpr.js\";\nimport { ExpressionTypeError } from \"../error/ExpressionTypeError.js\";\nimport { GreaterThan } from \"../expression/comparison/GreaterThan.js\";\nimport { GreaterThanOrEqual } from \"../expression/comparison/GreaterThanOrEqual.js\";\nimport { LessThan } from \"../expression/comparison/LessThan.js\";\nimport { LessThanOrEqual } from \"../expression/comparison/LessThanOrEqual.js\";\nimport { ExprManager } from \"./ExprManager.js\";\n\nexport class ExprCompiler extends IfcExpressionVisitor<Expr<any>> {\n private readonly methodCallTargetStack = [];\n private readonly typeManager: TypeManager;\n private readonly exprManager: ExprManager;\n\n constructor(typeManager: TypeManager) {\n super();\n this.typeManager = typeManager;\n this.exprManager = new ExprManager();\n }\n\n public getExprManager(): ExprManager {\n return this.exprManager;\n }\n\n visitExpr: (ctx: ExprContext) => Expr<any> = (ctx) => {\n return this.visit(ctx.singleExpr());\n };\n\n /*================================================\n * VariableRef\n *==============================================*/\n\n private associateContextAndReturn(expr: Expr<any>, ctx: ParserRuleContext) {\n this.exprManager.registerExprWithContext(expr, ctx);\n return expr;\n }\n\n visitVariableRef: (ctx: VariableRefContext) => Expr<any> = (ctx) => {\n if (ctx.IDENTIFIER().getText().toUpperCase() === \"PROPERTY\") {\n return this.associateContextAndReturn(new PropObjectReferenceExpr(), ctx);\n } else if (ctx.IDENTIFIER().getText().toUpperCase() === \"ELEMENT\") {\n return this.associateContextAndReturn(new ElemObjectReferenceExpr(), ctx);\n }\n throw new Error(`Parsing error: No variable '${ctx.getText()}' found `);\n };\n\n visitSEComparison: (ctx: SEComparisonContext) => Expr<any> = (ctx) => {\n const left = this.visit(ctx.singleExpr(0));\n const right = this.visit(ctx.singleExpr(1));\n switch (ctx.CMP_OP().getText()) {\n case \"==\":\n return this.associateContextAndReturn(new EqualsExpr(left, right), ctx);\n case \"!=\":\n return this.associateContextAndReturn(\n new NotEqualsExpr(left, right),\n ctx\n );\n case \">\":\n return this.associateContextAndReturn(\n new GreaterThan(left, right),\n ctx\n );\n case \">=\":\n return this.associateContextAndReturn(\n new GreaterThanOrEqual(left, right),\n ctx\n );\n case \"<\":\n return this.associateContextAndReturn(new LessThan(left, right), ctx);\n case \"<=\":\n return this.associateContextAndReturn(\n new LessThanOrEqual(left, right),\n ctx\n );\n }\n throw new Error(\n `Parsing error: comparison operator '${ctx\n .CMP_OP()\n .getText()}' not supported`\n );\n };\n\n visitSEMethodCall: (ctx: SEMethodCallContext) => Expr<any> = (ctx) => {\n this.methodCallTargetStack.push(this.visit(ctx.singleExpr()));\n return this.visit(ctx.methodCallChain());\n };\n\n visitSELiteral: (ctx: SELiteralContext) => Expr<any> = (ctx) => {\n return this.visit(ctx.literal());\n };\n\n visitSEVariableRef: (ctx: SEVariableRefContext) => Expr<any> = (ctx) => {\n return this.visit(ctx.variableRef());\n };\n visitSEArrayExpr: (ctx: SEArrayExprContext) => Expr<any> = (ctx) => {\n return this.visit(ctx.arrayExpr());\n };\n visitSEFunctionCall: (ctx: SEFunctionCallContext) => Expr<any> = (ctx) => {\n return this.visit(ctx.functionCall());\n };\n visitSEParenthesis: (ctx: SEParenthesisContext) => Expr<any> = (ctx) => {\n return this.associateContextAndReturn(\n new ParenthesisExpr(this.visit(ctx._sub)),\n ctx\n );\n };\n\n /*================================================\n * MethodCallChain\n *==============================================*/\n\n visitMethodCallChainInner: (ctx: MethodCallChainInnerContext) => Expr<any> = (\n ctx\n ) => {\n const functionExpr = new FunctionExpr(\n ctx.functionCall().IDENTIFIER().getText(),\n this.collectFunctionArguments(ctx.functionCall().exprList(), [\n this.methodCallTargetStack.pop(),\n ])\n );\n this.associateContextAndReturn(functionExpr, ctx.functionCall());\n this.methodCallTargetStack.push(functionExpr);\n return this.visit(ctx.methodCallChain());\n };\n\n visitMethodCallChainEnd: (ctx: MethodCallChainEndContext) => Expr<any> = (\n ctx\n ) => {\n return this.associateContextAndReturn(\n new FunctionExpr(\n ctx.functionCall().IDENTIFIER().getText(),\n this.collectFunctionArguments(ctx.functionCall().exprList(), [\n this.methodCallTargetStack.pop(),\n ])\n ),\n ctx.functionCall()\n );\n };\n\n visitSEAddSub: (ctx: SEAddSubContext) => Expr<any> = (ctx) => {\n this.typeManager.requireTypesOverlap(ctx._left, ctx._right);\n switch (ctx._op.text) {\n case \"+\":\n return this.makePlusExpr(ctx);\n case \"-\":\n return this.associateContextAndReturn(\n new MinusExpr(this.visit(ctx._left), this.visit(ctx._right)),\n ctx\n );\n default:\n ExprCompiler.failNode(ctx);\n }\n };\n\n private makePlusExpr(ctx: SEAddSubContext) {\n if (this.typeManager.isNumeric(ctx._left, ctx._right)) {\n return this.associateContextAndReturn(\n new PlusExpr(this.visit(ctx._left), this.visit(ctx._right)),\n ctx\n );\n }\n if (this.typeManager.isString(ctx._left, ctx._right)) {\n return this.associateContextAndReturn(\n new StringConcatExpr(this.visit(ctx._left), this.visit(ctx._right)),\n ctx\n );\n }\n if (\n this.typeManager.overlapsWithString(ctx._left, ctx._right) ||\n this.typeManager.overlapsWithNumeric(ctx._left, ctx._right)\n ) {\n return this.associateContextAndReturn(\n new PlusOrConcatExpr(this.visit(ctx._left), this.visit(ctx._right)),\n ctx\n );\n }\n throw new ExpressionTypeError(\n \"Operator '+' requires the operands to be either both of type numeric or both of type string, but they are not.\",\n ctx\n );\n }\n\n visitSEMulDiv: (ctx: SEMulDivContext) => Expr<any> = (ctx) => {\n switch (ctx._op.text) {\n case \"*\":\n return this.associateContextAndReturn(\n new MultiplyExpr(\n this.visit(ctx.getChild(0)),\n this.visit(ctx.getChild(2))\n ),\n ctx\n );\n case \"/\":\n return this.associateContextAndReturn(\n new DivideExpr(\n this.visit(ctx.getChild(0)),\n this.visit(ctx.getChild(2))\n ),\n ctx\n );\n default:\n ExprCompiler.failNode(ctx);\n }\n };\n\n /*================================================\n * StringExpr\n *===============================================*/\n\n visitStringLiteral: (ctx: StringLiteralContext) => Expr<any> = (ctx) => {\n const quotedString = ctx.QUOTED_STRING().getText();\n const text = quotedString.substring(1, quotedString.length - 1);\n return this.associateContextAndReturn(new StringLiteralExpr(text), ctx);\n };\n\n /*================================================\n * NumExpr\n *===============================================*/\n\n visitNumLiteral: (ctx: NumLiteralContext) => Expr<any> = (ctx) => {\n let val = ctx.INT();\n if (isPresent(val)) {\n return this.associateContextAndReturn(\n new NumericLiteralExpr(new Decimal(ctx.getText())),\n ctx\n );\n }\n val = ctx.FLOAT();\n if (isPresent(val)) {\n return this.associateContextAndReturn(\n new NumericLiteralExpr(new Decimal(ctx.getText())),\n ctx\n );\n }\n ExprCompiler.failNode(ctx);\n };\n\n visitSEUnaryMultipleMinus: (ctx: SEUnaryMultipleMinusContext) => Expr<any> = (\n ctx\n ) => {\n return this.visit(ctx.singleExpr());\n };\n visitSEPower: (ctx: SEPowerContext) => Expr<any> = (ctx) => {\n return this.associateContextAndReturn(\n new PowerExpr(this.visit(ctx._left), this.visit(ctx._right)),\n ctx\n );\n };\n visitSEUnaryMinus: (ctx: SEUnaryMinusContext) => Expr<any> = (ctx) => {\n return this.associateContextAndReturn(\n new UnaryMinusExpr(this.visit(ctx.singleExpr())),\n ctx\n );\n };\n\n /*================================================\n * BooleanExpr\n *===============================================*/\n\n visitSEBooleanBinaryOp: (ctx: SEBooleanBinaryOpContext) => Expr<any> = (\n ctx\n ) => {\n switch (ctx._op.text) {\n case \"&&\":\n return this.associateContextAndReturn(\n new AndExpr(\n this.visit(ctx.singleExpr(0)),\n this.visit(ctx.singleExpr(1))\n ),\n ctx\n );\n case \"||\":\n return this.associateContextAndReturn(\n new OrExpr(\n this.visit(ctx.singleExpr(0)),\n this.visit(ctx.singleExpr(1))\n ),\n ctx\n );\n case \"><\":\n return this.associateContextAndReturn(\n new XorExpr(\n this.visit(ctx.singleExpr(0)),\n this.visit(ctx.singleExpr(1))\n ),\n ctx\n );\n }\n throw new SyntaxErrorException(\n ctx._op.text,\n ctx._op.line,\n ctx._op.column,\n `Unknown boolean operator ${ctx._op.text}`\n );\n };\n\n visitBooleanLiteral: (ctx: BooleanLiteralContext) => Expr<any> = (ctx) => {\n return this.associateContextAndReturn(\n new BooleanLiteralExpr(ctx.BOOLEAN().getText().toUpperCase() === \"TRUE\"),\n ctx\n );\n };\n\n visitSENot: (ctx: SENotContext) => Expr<any> = (ctx) => {\n return this.associateContextAndReturn(\n new NotExpr(this.visit(ctx.singleExpr())),\n ctx\n );\n };\n\n /*================================================\n * ArrayExpr\n *===============================================*/\n\n visitArrayExpr: (ctx: ArrayExprContext) => Expr<any> = (ctx) => {\n return this.associateContextAndReturn(\n new ArrayExpr(this.collectArrayElements(ctx.arrayElementList())),\n ctx\n );\n };\n\n collectArrayElements: (ctx: ArrayElementListContext) => Array<Expr<any>> = (\n ctx\n ) => {\n if (!isNullish(ctx)) {\n const first = this.visit(ctx.singleExpr());\n const rest = ctx.arrayElementList();\n if (!isNullish(rest)) {\n const arr = this.collectArrayElements(rest);\n arr.unshift(first);\n return arr;\n }\n return [first];\n }\n return [];\n };\n\n /*================================================\n * FuncExpr\n *===============================================*/\n\n visitFunctionCall: (ctx: FunctionCallContext) => Expr<any> = (ctx) => {\n const args = isNullish(ctx.exprList())\n ? []\n : this.collectFunctionArguments(ctx.exprList());\n return this.associateContextAndReturn(\n new FunctionExpr(ctx.IDENTIFIER().getText(), args),\n ctx\n );\n };\n\n collectFunctionArguments: (\n ctx: ExprListContext,\n resultSoFar?: Array<Expr<any>>\n ) => Array<Expr<any>> = (ctx, resultSoFar?: Array<Expr<any>>) => {\n if (isNullish(resultSoFar)) {\n resultSoFar = [];\n }\n if (!isNullish(ctx)) {\n resultSoFar.push(this.visit(ctx.singleExpr()));\n const rest = ctx.exprList();\n if (!isNullish(rest)) {\n return this.collectFunctionArguments(rest, resultSoFar);\n }\n }\n return resultSoFar;\n };\n\n private static failNode(ctx: ParserRuleContext) {\n throw new Error(`Cannot parse (sub)expression ${ctx.getText()}`);\n }\n\n visitLiteral: (ctx: LiteralContext) => Expr<any> = (ctx) => {\n return this.visit(ctx.getChild(0));\n };\n}\n"]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ExprManager = void 0;
|
|
4
|
+
const ValidationException_1 = require("../error/ValidationException");
|
|
5
|
+
const IfcExpressionUtils_1 = require("../util/IfcExpressionUtils");
|
|
6
|
+
class ExprManager {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.contextToExpr = new Map();
|
|
9
|
+
}
|
|
10
|
+
registerExprWithContext(expr, ctx) {
|
|
11
|
+
const otherCtx = this.contextToExpr.get(expr);
|
|
12
|
+
if (!(0, IfcExpressionUtils_1.isNullish)(otherCtx) && otherCtx !== ctx) {
|
|
13
|
+
throw new ValidationException_1.ValidationException(`Expression (of kind '${expr.getKind}') at line ${ctx.start.line}, column ${ctx.start.start} is already associated with a ParserRuleContext of type ${otherCtx.constructor.name}' cannot associate it with another one (${ctx.constructor.name} at ${ctx.start.line}:${ctx.start.start}')`, ctx);
|
|
14
|
+
}
|
|
15
|
+
this.contextToExpr.set(expr, ctx);
|
|
16
|
+
}
|
|
17
|
+
getContext(expr) {
|
|
18
|
+
return this.contextToExpr.get(expr);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
exports.ExprManager = ExprManager;
|
|
22
|
+
//# sourceMappingURL=ExprManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/compiler/ExprManager.ts"],"names":[],"mappings":";;;AAEA,sEAAmE;AACnE,mEAAuD;AAEvD,MAAa,WAAW;IAGtB;QAFiB,kBAAa,GAAG,IAAI,GAAG,EAAgC,CAAC;IAE1D,CAAC;IAET,uBAAuB,CAAC,IAAe,EAAE,GAAG;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAA,8BAAS,EAAC,QAAQ,CAAC,IAAI,QAAQ,KAAK,GAAG,EAAE;YAC5C,MAAM,IAAI,yCAAmB,CAC3B,wBAAwB,IAAI,CAAC,OAAO,cAAc,GAAG,CAAC,KAAK,CAAC,IAAI,YAAY,GAAG,CAAC,KAAK,CAAC,KAAK,2DAA2D,QAAQ,CAAC,WAAW,CAAC,IAAI,2CAA2C,GAAG,CAAC,WAAW,CAAC,IAAI,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,EAC1R,GAAG,CACJ,CAAC;SACH;QACD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACpC,CAAC;IAED,UAAU,CAAC,IAAe;QACxB,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;CACF;AAnBD,kCAmBC","file":"compiler/ExprManager.js","sourcesContent":["import { ParserRuleContext } from \"antlr4\";\nimport { Expr } from \"../expression/Expr\";\nimport { ValidationException } from \"../error/ValidationException\";\nimport { isNullish } from \"../util/IfcExpressionUtils\";\n\nexport class ExprManager {\n private readonly contextToExpr = new Map<Expr<any>, ParserRuleContext>();\n\n constructor() {}\n\n public registerExprWithContext(expr: Expr<any>, ctx) {\n const otherCtx = this.contextToExpr.get(expr);\n if (!isNullish(otherCtx) && otherCtx !== ctx) {\n throw new ValidationException(\n `Expression (of kind '${expr.getKind}') at line ${ctx.start.line}, column ${ctx.start.start} is already associated with a ParserRuleContext of type ${otherCtx.constructor.name}' cannot associate it with another one (${ctx.constructor.name} at ${ctx.start.line}:${ctx.start.start}')`,\n ctx\n );\n }\n this.contextToExpr.set(expr, ctx);\n }\n\n getContext(expr: Expr<any>) {\n return this.contextToExpr.get(expr);\n }\n}\n"]}
|