comparison trunk/src/dil/parser/Parser.d @ 748:efd87fdb1c00

Tidied up dil.parser.Parser a bit.
author Aziz K?ksal <aziz.koeksal@gmail.com>
date Mon, 11 Feb 2008 17:23:27 +0100
parents 7917811f8116
children 7db35977b947
comparison
equal deleted inserted replaced
747:00f872d949ea 748:efd87fdb1c00
1919 1919
1920 auto params = new Parameters; 1920 auto params = new Parameters;
1921 Expression e; // Aggregate or LwrExpression 1921 Expression e; // Aggregate or LwrExpression
1922 1922
1923 require(T.LParen); 1923 require(T.LParen);
1924 while (1) 1924 auto paramsBegin = token;
1925 do
1925 { 1926 {
1926 auto paramBegin = token; 1927 auto paramBegin = token;
1927 StorageClass stc; 1928 StorageClass stc;
1928 Type type; 1929 Type type;
1929 Identifier* ident; 1930 Identifier* ident;
1945 default: 1946 default:
1946 type = parseDeclarator(ident); 1947 type = parseDeclarator(ident);
1947 } 1948 }
1948 1949
1949 params ~= set(new Parameter(stc, type, ident, null), paramBegin); 1950 params ~= set(new Parameter(stc, type, ident, null), paramBegin);
1950 1951 } while (skipped(T.Comma))
1951 if (token.kind != T.Comma) 1952 set(params, paramsBegin);
1952 break;
1953 nT();
1954 }
1955 require(T.Semicolon); 1953 require(T.Semicolon);
1956 e = parseExpression(); 1954 e = parseExpression();
1957 version(D2) 1955 version(D2)
1958 { //Foreach (ForeachType; LwrExpression .. UprExpression ) ScopeStatement 1956 { //Foreach (ForeachType; LwrExpression .. UprExpression ) ScopeStatement
1959 if (skipped(T.Slice)) 1957 if (skipped(T.Slice))
3232 3230
3233 nT(); 3231 nT();
3234 if (!skipped(T.RBracket)) 3232 if (!skipped(T.RBracket))
3235 { 3233 {
3236 e = parseAssignExpression(); 3234 e = parseAssignExpression();
3237 if (token.kind == T.Colon) 3235 if (skipped(T.Colon))
3238 goto LparseAssocArray; 3236 goto LparseAssocArray;
3239 if (skipped(T.Comma)) 3237 if (skipped(T.Comma))
3240 values = [e] ~ parseExpressionList(); 3238 values = [e] ~ parseExpressionList();
3241 require(T.RBracket); 3239 require(T.RBracket);
3242 } 3240 }
3243 3241
3244 e = new ArrayLiteralExpression(values); 3242 e = new ArrayLiteralExpression(values);
3245 break; 3243 break;
3246 3244
3247 LparseAssocArray: 3245 LparseAssocArray:
3248 Expression[] keys; 3246 Expression[] keys = [e];
3249 3247
3250 keys ~= e;
3251 nT(); // Skip colon.
3252 goto LenterLoop; 3248 goto LenterLoop;
3253 3249 do
3254 while (1)
3255 { 3250 {
3256 keys ~= parseAssignExpression(); 3251 keys ~= parseAssignExpression();
3257 require(T.Colon); 3252 require(T.Colon);
3258 LenterLoop: 3253 LenterLoop:
3259 values ~= parseAssignExpression(); 3254 values ~= parseAssignExpression();
3260 if (token.kind != T.Comma) 3255 } while (skipped(T.Comma))
3261 break;
3262 nT();
3263 }
3264 require(T.RBracket); 3256 require(T.RBracket);
3265 e = new AArrayLiteralExpression(keys, values); 3257 e = new AArrayLiteralExpression(keys, values);
3266 break; 3258 break;
3267 case T.LBrace: 3259 case T.LBrace:
3268 // DelegateLiteral := { Statements } 3260 // DelegateLiteral := { Statements }
3777 auto params = new Parameters(); 3769 auto params = new Parameters();
3778 3770
3779 if (skipped(T.RParen)) 3771 if (skipped(T.RParen))
3780 return set(params, begin); 3772 return set(params, begin);
3781 3773
3782 Loop:
3783 while (1) 3774 while (1)
3784 { 3775 {
3785 auto paramBegin = token; 3776 auto paramBegin = token;
3786 StorageClass stc, tmp; 3777 StorageClass stc, stc_;
3787 Type type; 3778 Type type;
3788 Identifier* ident; 3779 Identifier* ident;
3789 Expression defValue; 3780 Expression defValue;
3790 3781
3791 void pushParameter() 3782 void pushParameter()
3795 3786
3796 if (skipped(T.Ellipses)) 3787 if (skipped(T.Ellipses))
3797 { 3788 {
3798 stc = StorageClass.Variadic; 3789 stc = StorageClass.Variadic;
3799 pushParameter(); // type, ident and defValue will be null. 3790 pushParameter(); // type, ident and defValue will be null.
3800 break Loop; 3791 break;
3801 } 3792 }
3802 3793
3803 Lstc_loop: 3794 while (1)
3804 switch (token.kind) 3795 { // Parse storage classes.
3805 { 3796 switch (token.kind)
3806 version(D2) 3797 {
3807 { 3798 version(D2)
3808 case T.Invariant: // D2.0 3799 {
3809 if (peekNext() == T.LParen) 3800 case T.Invariant: // D2.0
3810 goto default; 3801 if (peekNext() == T.LParen)
3811 tmp = StorageClass.Invariant; 3802 break;
3812 goto Lcommon; 3803 stc_ = StorageClass.Invariant;
3813 case T.Const: // D2.0 3804 goto Lcommon;
3814 if (peekNext() == T.LParen) 3805 case T.Const: // D2.0
3815 goto default; 3806 if (peekNext() == T.LParen)
3816 tmp = StorageClass.Const; 3807 break;
3817 goto Lcommon; 3808 stc_ = StorageClass.Const;
3818 case T.Final: // D2.0 3809 goto Lcommon;
3819 tmp = StorageClass.Final; 3810 case T.Final: // D2.0
3820 goto Lcommon; 3811 stc_ = StorageClass.Final;
3821 case T.Scope: // D2.0 3812 goto Lcommon;
3822 tmp = StorageClass.Scope; 3813 case T.Scope: // D2.0
3823 goto Lcommon; 3814 stc_ = StorageClass.Scope;
3824 case T.Static: // D2.0 3815 goto Lcommon;
3825 tmp = StorageClass.Static; 3816 case T.Static: // D2.0
3826 goto Lcommon; 3817 stc_ = StorageClass.Static;
3827 } 3818 goto Lcommon;
3828 case T.In: 3819 }
3829 tmp = StorageClass.In; 3820 case T.In:
3830 goto Lcommon; 3821 stc_ = StorageClass.In;
3831 case T.Out: 3822 goto Lcommon;
3832 tmp = StorageClass.Out; 3823 case T.Out:
3833 goto Lcommon; 3824 stc_ = StorageClass.Out;
3834 case T.Inout, T.Ref: 3825 goto Lcommon;
3835 tmp = StorageClass.Ref; 3826 case T.Inout, T.Ref:
3836 goto Lcommon; 3827 stc_ = StorageClass.Ref;
3837 case T.Lazy: 3828 goto Lcommon;
3838 tmp = StorageClass.Lazy; 3829 case T.Lazy:
3839 goto Lcommon; 3830 stc_ = StorageClass.Lazy;
3840 Lcommon: 3831 goto Lcommon;
3841 // Check for redundancy. 3832 Lcommon:
3842 if (stc & tmp) 3833 // Check for redundancy.
3843 error(MID.RedundantStorageClass, token.srcText); 3834 if (stc & stc_)
3835 error(MID.RedundantStorageClass, token.srcText);
3836 else
3837 stc |= stc_;
3838 nT();
3839 version(D2)
3840 continue;
3844 else 3841 else
3845 stc |= tmp; 3842 break; // In D1.0 the grammar only allows one storage class.
3846 nT(); 3843 default:
3847 version(D2)
3848 goto Lstc_loop;
3849 else
3850 goto default; // In D1.0 only one stc per parameter is allowed.
3851 default:
3852 type = parseDeclarator(ident, true);
3853
3854 if (skipped(T.Assign))
3855 defValue = parseAssignExpression();
3856
3857 if (skipped(T.Ellipses))
3858 {
3859 stc |= StorageClass.Variadic;
3860 pushParameter();
3861 break Loop;
3862 } 3844 }
3863 3845 break; // Break out of inner loop.
3846 }
3847 type = parseDeclarator(ident, true);
3848
3849 if (skipped(T.Assign))
3850 defValue = parseAssignExpression();
3851
3852 if (skipped(T.Ellipses))
3853 {
3854 stc |= StorageClass.Variadic;
3864 pushParameter(); 3855 pushParameter();
3865 3856 break;
3866 if (token.kind != T.Comma) 3857 }
3867 break Loop; 3858 pushParameter();
3868 nT(); 3859
3869 } 3860 } while (skipped(T.Comma))
3870 }
3871 require(T.RParen); 3861 require(T.RParen);
3872 return set(params, begin); 3862 return set(params, begin);
3873 } 3863 }
3874 3864
3875 TemplateArguments parseTemplateArguments() 3865 TemplateArguments parseTemplateArguments()
3900 3890
3901 TemplateArguments parseTemplateArguments_() 3891 TemplateArguments parseTemplateArguments_()
3902 { 3892 {
3903 auto begin = token; 3893 auto begin = token;
3904 auto targs = new TemplateArguments; 3894 auto targs = new TemplateArguments;
3905 while (1) 3895 do
3906 { 3896 {
3907 Type parseType_() 3897 Type parseType_()
3908 { 3898 {
3909 auto type = parseType(); 3899 auto type = parseType();
3910 if (token.kind == T.Comma || token.kind == T.RParen) 3900 if (token.kind == T.Comma || token.kind == T.RParen)
3921 targs ~= typeArgument; 3911 targs ~= typeArgument;
3922 else 3912 else
3923 // TemplateArgument: 3913 // TemplateArgument:
3924 // AssignExpression 3914 // AssignExpression
3925 targs ~= parseAssignExpression(); 3915 targs ~= parseAssignExpression();
3926 if (token.kind != T.Comma) 3916 } while (skipped(T.Comma))
3927 break; // Exit loop.
3928 nT();
3929 }
3930 set(targs, begin); 3917 set(targs, begin);
3931 return targs; 3918 return targs;
3932 } 3919 }
3933 3920
3934 TemplateParameters parseTemplateParameterList() 3921 TemplateParameters parseTemplateParameterList()
3959 TemplateParameters parseTemplateParameterList_() 3946 TemplateParameters parseTemplateParameterList_()
3960 { 3947 {
3961 auto begin = token; 3948 auto begin = token;
3962 auto tparams = new TemplateParameters; 3949 auto tparams = new TemplateParameters;
3963 3950
3964 while (1) 3951 do
3965 { 3952 {
3966 auto paramBegin = token; 3953 auto paramBegin = token;
3967 TemplateParameter tp; 3954 TemplateParameter tp;
3968 Identifier* ident; 3955 Identifier* ident;
3969 Type specType, defType; 3956 Type specType, defType;
4042 } 4029 }
4043 4030
4044 // Push template parameter. 4031 // Push template parameter.
4045 tparams ~= set(tp, paramBegin); 4032 tparams ~= set(tp, paramBegin);
4046 4033
4047 if (token.kind != T.Comma) 4034 } while (skipped(T.Comma))
4048 break;
4049 nT();
4050 }
4051 set(tparams, begin); 4035 set(tparams, begin);
4052 return tparams; 4036 return tparams;
4053 } 4037 }
4054 4038
4055 void expected(TOK tok) 4039 void expected(TOK tok)