@@ -353,7 +353,7 @@ private FunctionDeclaration FunctionDeclaration()
353353 else if ( CurrentIs ( "Assign" ) )
354354 {
355355 Expect ( "Assign" ) ;
356- var value = Literal ( ) ;
356+ var value = LiteralNode ( ) ;
357357 indexOfFirstDefaultArgument = args . Count < indexOfFirstDefaultArgument
358358 ? args . Count
359359 : indexOfFirstDefaultArgument ;
@@ -711,11 +711,11 @@ private Expression MultiplicativeExpression()
711711 }
712712
713713 /// <summary>
714- /// UnaryExpression -> LeftHandSideExpression | ('-'|'!'|'~'|'$' ) UnaryExpression
714+ /// UnaryExpression -> LeftHandSideExpression | ('-'|'!'|'~') UnaryExpression
715715 /// </summary>
716716 private Expression UnaryExpression ( )
717717 {
718- if ( CurrentIsUnaryOperator ( ) )
718+ if ( CurrentIsUnaryOperator ( expectEnv : false ) )
719719 {
720720 var op = Expect ( "Operator" ) ;
721721 return new UnaryExpression ( op . Value , UnaryExpression ( ) )
@@ -761,7 +761,7 @@ private Expression PrimaryExpression()
761761
762762 if ( CurrentIsLiteral ( ) )
763763 {
764- return Literal ( ) ;
764+ return LiteralNode ( ) ;
765765 }
766766
767767 if ( CurrentIs ( "LeftCurl" ) )
@@ -784,52 +784,35 @@ private Expression PrimaryExpression()
784784 /// "StringLiteral"
785785 /// "BooleanLiteral"
786786 /// </summary>
787- private Literal Literal ( )
787+ private Literal LiteralNode ( )
788788 {
789789 var segment = _tokens . Current . Segment ;
790790 if ( CurrentIs ( "StringLiteral" ) )
791791 {
792792 var str = Expect ( "StringLiteral" ) ;
793- return new Literal (
794- new TypeIdentValue (
795- TypeId : new IdentifierReference ( name : "string" )
796- { Segment = str . Segment } ) ,
793+ return Literal . String (
797794 value : Regex . Unescape ( str . Value . Trim ( '"' ) ) ,
798795 segment ,
799796 label : str . Value
800797 . Replace ( @"\" , @"\\" )
801798 . Replace ( @"""" , @"\""" ) ) ;
802799 }
803800
801+ if ( CurrentIs ( "NullLiteral" ) )
802+ {
803+ Expect ( "NullLiteral" ) ;
804+ return Literal . Null ( segment ) ;
805+ }
806+
804807 return _tokens . Current . Type . Tag switch
805808 {
806- "NullLiteral" => new Literal (
807- new TypeIdentValue (
808- TypeId : new IdentifierReference ( name : "null" )
809- { Segment = _tokens . Current . Segment } ) ,
810- Expect ( "NullLiteral" ) . Value == "null" ? null : string . Empty ,
811- segment ,
812- label : "null" ) ,
813- "IntegerLiteral" => new Literal (
814- new TypeIdentValue (
815- TypeId : new IdentifierReference ( name : "number" )
816- { Segment = _tokens . Current . Segment } ) ,
817- value : double . Parse ( Expect ( "IntegerLiteral" ) . Value ) ,
818- segment ) ,
819- "FloatLiteral" => new Literal (
820- new TypeIdentValue (
821- TypeId : new IdentifierReference ( name : "number" )
822- { Segment = _tokens . Current . Segment } ) ,
809+ "IntegerLiteral" => Literal . Number ( value : double . Parse ( Expect ( "IntegerLiteral" ) . Value ) , segment ) ,
810+ "FloatLiteral" => Literal . Number (
823811 value : double . Parse (
824812 Expect ( "FloatLiteral" ) . Value ,
825813 CultureInfo . InvariantCulture ) ,
826814 segment ) ,
827- "BooleanLiteral" => new Literal (
828- new TypeIdentValue (
829- TypeId : new IdentifierReference ( name : "boolean" )
830- { Segment = _tokens . Current . Segment } ) ,
831- value : bool . Parse ( Expect ( "BooleanLiteral" ) . Value ) ,
832- segment ) ,
815+ "BooleanLiteral" => Literal . Boolean ( value : bool . Parse ( Expect ( "BooleanLiteral" ) . Value ) , segment ) ,
833816 _ => throw new ParserException ( "There are no more supported literals" )
834817 } ;
835818 }
0 commit comments