506
523
{ComponentTypeLists,Rest2} = parse_ComponentTypeLists(Rest),
508
525
[{'}',_}|Rest3] ->
509
{#type{def=#'SEQUENCE'{components=ComponentTypeLists}},Rest3};
526
ComponentTypeLists2 =
527
case {[Ext||Ext = #'EXTENSIONMARK'{} <- ComponentTypeLists],
528
get(extensiondefault)} of
529
{[],'IMPLIED'} -> ComponentTypeLists ++ [#'EXTENSIONMARK'{}];
530
_ -> ComponentTypeLists
532
{#type{def=#'SEQUENCE'{components = ComponentTypeLists2}},
511
535
throw({asn1_error,{get_line(hd(Rest2)),get(asn1_module),
512
536
[got,get_token(hd(Rest2)),expected,'}']}})
539
parse_BuiltinType([{'SEQUENCE',_},{'OF',_},Id={identifier,_,_},Lt={'<',_}|Rest]) ->
540
%% TODO: take care of the identifier for something useful
541
{Type,Rest2} = parse_SelectionType([Id,Lt|Rest]),
542
{#type{def={'SEQUENCE OF',#type{def=Type,tag=[]}}},Rest2};
544
parse_BuiltinType([{'SEQUENCE',_},{'OF',_},{identifier,_,_} |Rest]) ->
545
%% TODO: take care of the identifier for something useful
546
{Type,Rest2} = parse_Type(Rest),
547
{#type{def={'SEQUENCE OF',Type}},Rest2};
514
549
parse_BuiltinType([{'SEQUENCE',_},{'OF',_}|Rest]) ->
515
550
{Type,Rest2} = parse_Type(Rest),
516
551
{#type{def={'SEQUENCE OF',Type}},Rest2};
519
554
parse_BuiltinType([{'SET',_},{'{',_},{'...',Line},{'}',_}|Rest]) ->
520
{#type{def=#'SET'{components=[{'EXTENSIONMARK',Line,undefined}]}},Rest};
555
{#type{def=#'SET'{components=[#'EXTENSIONMARK'{pos = Line}]}},Rest};
521
556
parse_BuiltinType([{'SET',_},{'{',_},{'...',Line},{'!',_}|Rest]) ->
522
557
{ExceptionIdentification,Rest2} = parse_ExceptionIdentification(Rest),
524
559
[{'}',_}|Rest3] ->
525
560
{#type{def=#'SET'{components=
526
[{'EXTENSIONMARK',Line,ExceptionIdentification}]}},
561
[#'EXTENSIONMARK'{pos = Line,
562
val = ExceptionIdentification}]}},
529
565
throw({asn1_error,{get_line(hd(Rest2)),get(asn1_module),
564
619
parse_TypeWithConstraint([{'SEQUENCE',_},Lpar = {'(',_}|Rest]) ->
565
620
{Constraint,Rest2} = parse_Constraint([Lpar|Rest]),
568
{Type,Rest4} = parse_Type(Rest3),
569
{#type{def = {'SEQUENCE OF',Type}, constraint = merge_constraints([Constraint])},Rest4};
571
throw({asn1_error,{get_line(hd(Rest2)),get(asn1_module),
572
[got,get_token(hd(Rest2)),expected,'OF']}})
621
Rest4 = case Rest2 of
622
[{'OF',_}, {identifier,_,_Id}|Rest3] ->
623
%%% TODO: make some use of the identifier, maybe useful in the XML mapping
629
{get_line(hd(Rest2)),get(asn1_module),
630
[got,get_token(hd(Rest2)),expected,'OF']}})
632
{Type,Rest5} = parse_Type(Rest4),
633
{#type{def = {'SEQUENCE OF',Type},
634
constraint = merge_constraints([Constraint])},Rest5};
574
636
parse_TypeWithConstraint([{'SEQUENCE',_},{'SIZE',_},Lpar = {'(',_}|Rest]) ->
575
637
{Constraint,Rest2} = parse_Constraint([Lpar|Rest]),
576
638
#constraint{c=C} = Constraint,
577
639
Constraint2 = Constraint#constraint{c={'SizeConstraint',C}},
580
{Type,Rest4} = parse_Type(Rest3),
581
{#type{def = {'SEQUENCE OF',Type}, constraint = merge_constraints([Constraint2])},Rest4};
583
throw({asn1_error,{get_line(hd(Rest2)),get(asn1_module),
584
[got,get_token(hd(Rest2)),expected,'OF']}})
640
Rest4 = case Rest2 of
641
[{'OF',_}, {identifier,_,_Id}|Rest3] ->
642
%%% TODO: make some use of the identifier, maybe useful in the XML mapping
647
throw({asn1_error,{get_line(hd(Rest2)),get(asn1_module),
648
[got,get_token(hd(Rest2)),expected,'OF']}})
650
{Type,Rest5} = parse_Type(Rest4),
651
{#type{def = {'SEQUENCE OF',Type}, constraint = merge_constraints([Constraint2])},Rest5};
586
653
parse_TypeWithConstraint([{'SET',_},Lpar = {'(',_}|Rest]) ->
587
654
{Constraint,Rest2} = parse_Constraint([Lpar|Rest]),
590
{Type,Rest4} = parse_Type(Rest3),
591
{#type{def = {'SET OF',Type}, constraint = merge_constraints([Constraint])},Rest4};
593
throw({asn1_error,{get_line(hd(Rest2)),get(asn1_module),
594
[got,get_token(hd(Rest2)),expected,'OF']}})
655
Rest4 = case Rest2 of
656
[{'OF',_}, {identifier,_,_Id}|Rest3] ->
657
%%% TODO: make some use of the identifier, maybe useful in the XML mapping
663
{get_line(hd(Rest2)),get(asn1_module),
664
[got,get_token(hd(Rest2)),expected,'OF']}})
666
{Type,Rest5} = parse_Type(Rest4),
667
{#type{def = {'SET OF',Type},
668
constraint = merge_constraints([Constraint])},Rest5};
596
670
parse_TypeWithConstraint([{'SET',_},{'SIZE',_},Lpar = {'(',_}|Rest]) ->
597
671
{Constraint,Rest2} = parse_Constraint([Lpar|Rest]),
598
672
#constraint{c=C} = Constraint,
599
673
Constraint2 = Constraint#constraint{c={'SizeConstraint',C}},
602
{Type,Rest4} = parse_Type(Rest3),
603
{#type{def = {'SET OF',Type}, constraint = merge_constraints([Constraint2])},Rest4};
605
throw({asn1_error,{get_line(hd(Rest2)),get(asn1_module),
606
[got,get_token(hd(Rest2)),expected,'OF']}})
674
Rest4 = case Rest2 of
675
[{'OF',_}, {identifier,_,_Id}|Rest3] ->
676
%%% TODO: make some use of the identifier, maybe useful in the XML mapping
682
{get_line(hd(Rest2)),get(asn1_module),
683
[got,get_token(hd(Rest2)),expected,'OF']}})
685
{Type,Rest5} = parse_Type(Rest4),
686
{#type{def = {'SET OF',Type},
687
constraint = merge_constraints([Constraint2])},Rest5};
608
689
parse_TypeWithConstraint(Tokens) ->
609
690
throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
610
691
[got,get_token(hd(Tokens)),expected,
2259
2340
ordsets:from_list([V]).
2262
2342
parse_AlternativeTypeLists(Tokens) ->
2263
{AlternativeTypeList,Rest1} = parse_AlternativeTypeList(Tokens),
2264
{ExtensionAndException,Rest2} =
2266
[{',',_},{'...',L1},{'!',_}|Rest12] ->
2267
{_,Rest13} = parse_ExceptionIdentification(Rest12),
2268
%% Exception info is currently thrown away
2269
{[#'EXTENSIONMARK'{pos=L1}],Rest13};
2270
[{',',_},{'...',L1}|Rest12] ->
2271
{[#'EXTENSIONMARK'{pos=L1}],Rest12};
2275
case ExtensionAndException of
2277
{AlternativeTypeList,Rest2};
2343
parse_AlternativeTypeLists(Tokens,[]).
2345
parse_AlternativeTypeLists(Tokens = [{identifier,_,_}|_Rest0],Clist) ->
2346
{CompList,Rest1} = parse_AlternativeTypeList(Tokens,[]),
2347
parse_AlternativeTypeLists(Rest1,Clist++CompList);
2348
parse_AlternativeTypeLists([{'...',L1},{'!',_}|Rest02],Clist0) ->
2349
{_,Rest03} = parse_ExceptionIdentification(Rest02),
2350
%% Exception info is currently thrown away
2351
parse_AlternativeTypeLists2(Rest03,Clist0++[#'EXTENSIONMARK'{pos=L1}]);
2352
parse_AlternativeTypeLists([{',',L1},{'...',_},{'!',_}|Rest02],Clist0) when Clist0 =/= []->
2353
{_,Rest03} = parse_ExceptionIdentification(Rest02),
2354
%% Exception info is currently thrown away
2355
parse_AlternativeTypeLists2(Rest03,Clist0++[#'EXTENSIONMARK'{pos=L1}]);
2357
parse_AlternativeTypeLists([{',',_},{'...',L1}|Rest02],Clist0) when Clist0 =/= []->
2358
parse_AlternativeTypeLists2(Rest02,Clist0++[#'EXTENSIONMARK'{pos=L1}]);
2359
parse_AlternativeTypeLists([{'...',L1}|Rest02],Clist0) ->
2360
parse_AlternativeTypeLists2(Rest02,Clist0++[#'EXTENSIONMARK'{pos=L1}]);
2361
parse_AlternativeTypeLists(Tokens = [{'}',_L1}|_Rest02],Clist0) ->
2364
parse_AlternativeTypeLists2(Tokens,Clist) ->
2365
{ExtAdd,Rest} = parse_ExtensionAdditionAlternatives(Tokens,Clist),
2366
{Clist2,Rest2} = parse_OptionalExtensionMarker(Rest,lists:flatten(ExtAdd)),
2369
{CompList,Rest4} = parse_AlternativeTypeList(Rest3,[]),
2370
{Clist2 ++ CompList,Rest4};
2279
{ExtensionAddition,Rest3} =
2282
parse_ExtensionAdditionAlternativeList(Rest23);
2286
{OptionalExtensionMarker,Rest4} =
2288
[{',',_},{'...',L3}|Rest31] ->
2289
{[#'EXTENSIONMARK'{pos=L3}],Rest31};
2293
{AlternativeTypeList ++ ExtensionAndException ++ ExtensionAddition ++ OptionalExtensionMarker, Rest4}
2297
parse_AlternativeTypeList(Tokens) ->
2298
parse_AlternativeTypeList(Tokens,[]).
2300
parse_AlternativeTypeList(Tokens,Acc) ->
2301
{NamedType,Rest} = parse_NamedType(Tokens),
2377
parse_AlternativeTypeList([{',',_},Id = {identifier,_,_}|Rest],Acc) when Acc =/= [] ->
2378
{AlternativeType,Rest2} = parse_NamedType([Id|Rest]),
2379
parse_AlternativeTypeList(Rest2,[AlternativeType|Acc]);
2380
parse_AlternativeTypeList(Tokens = [{'}',_}|_],Acc) ->
2381
{lists:reverse(Acc),Tokens};
2382
parse_AlternativeTypeList(Tokens = [{']',_},{']',_}|_],Acc) ->
2383
{lists:reverse(Acc),Tokens};
2384
parse_AlternativeTypeList(Tokens = [{',',_},{'...',_}|_],Acc) ->
2385
{lists:reverse(Acc),Tokens};
2386
parse_AlternativeTypeList(Tokens,[]) ->
2387
{AlternativeType,Rest} = parse_NamedType(Tokens),
2388
parse_AlternativeTypeList(Rest,[AlternativeType]);
2389
parse_AlternativeTypeList(Tokens,_) ->
2391
{get_line(hd(Tokens)),get(asn1_module),
2392
[got,[get_token(hd(Tokens)),get_token(hd(tl(Tokens)))],
2393
expected,['}',', identifier']]}}).
2395
parse_ExtensionAdditionAlternatives(Tokens =[{',',_}|_],Clist) ->
2396
{ExtAddList,Rest2} = parse_ExtensionAdditionAlternativesList(Tokens,[]),
2397
{Clist++lists:flatten(ExtAddList),Rest2};
2398
parse_ExtensionAdditionAlternatives(Tokens,Clist) ->
2402
parse_ExtensionAdditionAlternativesList([{',',_},Id = {identifier,_,_}|Rest],Acc) ->
2403
{AlternativeType,Rest2} = parse_NamedType([Id|Rest]),
2404
parse_ExtensionAdditionAlternativesList(Rest2,[AlternativeType|Acc]);
2405
parse_ExtensionAdditionAlternativesList([{',',_},C1 = {'[',_},C2 = {'[',_}|Rest],Acc) ->
2406
{ExtAddGroup,Rest2} = parse_ExtensionAdditionAlternativesGroup([C1,C2|Rest],[]),
2407
parse_ExtensionAdditionAlternativesList(Rest2,[ExtAddGroup|Acc]);
2408
parse_ExtensionAdditionAlternativesList(Tokens = [{'}',_}|_],Acc) ->
2409
{lists:reverse(Acc),Tokens};
2410
parse_ExtensionAdditionAlternativesList(Tokens = [{',',_},{'...',_}|_],Acc) ->
2411
{lists:reverse(Acc),Tokens};
2412
parse_ExtensionAdditionAlternativesList(Tokens,_) ->
2414
{get_line(hd(Tokens)),get(asn1_module),
2415
[got,[get_token(hd(Tokens)),get_token(hd(tl(Tokens)))],
2416
expected,['}',', identifier']]}}).
2419
parse_ExtensionAdditionAlternativesGroup([ {'[',_},{'[',_},_VsnNr = {number,_,Num},{':',_}|Rest],[]) ->
2420
parse_ExtensionAdditionAlternativesGroup2(Rest,Num);
2421
parse_ExtensionAdditionAlternativesGroup([ {'[',_},{'[',_}|Rest],[]) ->
2422
parse_ExtensionAdditionAlternativesGroup2(Rest,undefined);
2423
parse_ExtensionAdditionAlternativesGroup(Tokens,_) ->
2425
{get_line(hd(Tokens)),get(asn1_module),
2426
[got,[get_token(hd(Tokens)),get_token(hd(tl(Tokens)))],
2427
expected,['[[']]}}).
2430
parse_ExtensionAdditionAlternativesGroup2(Tokens,Num) ->
2431
{CompTypeList,Rest} = parse_AlternativeTypeList(Tokens,[]),
2303
[{',',_},Id = {identifier,_,_}|Rest2] ->
2304
parse_AlternativeTypeList([Id|Rest2],[NamedType|Acc]);
2306
{lists:reverse([NamedType|Acc]),Rest}
2311
parse_ExtensionAdditionAlternativeList(Tokens) ->
2312
parse_ExtensionAdditionAlternativeList(Tokens,[]).
2314
parse_ExtensionAdditionAlternativeList(Tokens,Acc) ->
2317
[{identifier,_,_}|_Rest] ->
2318
parse_NamedType(Tokens);
2319
[{'[',_},{'[',_}|_] ->
2320
parse_ExtensionAdditionAlternatives(Tokens)
2324
parse_ExtensionAdditionAlternativeList(Rest01,[Element|Acc]);
2326
{lists:reverse([Element|Acc]),Rest0}
2329
parse_ExtensionAdditionAlternatives([{'[',_},{'[',_}|Rest]) ->
2330
parse_ExtensionAdditionAlternatives(Rest,[]);
2331
parse_ExtensionAdditionAlternatives(Tokens) ->
2332
throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
2333
[got,get_token(hd(Tokens)),expected,'[[']}}).
2335
parse_ExtensionAdditionAlternatives([Id = {identifier,_,_}|Rest],Acc) ->
2336
{NamedType, Rest2} = parse_NamedType([Id|Rest]),
2339
parse_ExtensionAdditionAlternatives(Rest21,[NamedType|Acc]);
2340
[{']',_},{']',_}|Rest21] ->
2341
{lists:reverse(Acc),Rest21};
2343
throw({asn1_error,{get_line(hd(Rest2)),get(asn1_module),
2344
[got,get_token(hd(Rest2)),expected,[',',']]']]}})
2433
[{']',_},{']',_}|Rest2] ->
2434
{[{'ExtensionAdditionGroup',Num}|CompTypeList] ++
2435
['ExtensionAdditionGroupEnd'],Rest2};
2437
throw({asn1_error,{get_line(hd(Rest)),get(asn1_module),
2438
[got,get_token(hd(Rest)),expected,[']]']]}})
2441
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2443
%% parse_AlternativeTypeLists(Tokens,ExtensionDefault) ->
2444
%% {AltTypeList,Rest1} = parse_AlternativeTypeList(Tokens),
2445
%% {ExtensionAndException,Rest2} =
2447
%% [{',',_},{'...',L1},{'!',_}|Rest12] ->
2448
%% {_,Rest13} = parse_ExceptionIdentification(Rest12),
2449
%% %% Exception info is currently thrown away
2450
%% {[#'EXTENSIONMARK'{pos=L1}],Rest13};
2451
%% [{',',_},{'...',L1}|Rest12] ->
2452
%% {[#'EXTENSIONMARK'{pos=L1}],Rest12};
2456
%% {AltTypeList2,Rest5} =
2457
%% case ExtensionAndException of
2459
%% {AltTypeList,Rest2};
2461
%% {ExtensionAddition,Rest3} =
2463
%% [{',',_}|Rest23] ->
2464
%% parse_ExtensionAdditionAlternativeList(Rest23);
2468
%% {OptionalExtensionMarker,Rest4} =
2470
%% [{',',_},{'...',L3}|Rest31] ->
2471
%% {[#'EXTENSIONMARK'{pos=L3}],Rest31};
2475
%% {AltTypeList ++ ExtensionAndException ++
2476
%% ExtensionAddition ++ OptionalExtensionMarker, Rest4}
2479
%% case [X || X=#'EXTENSIONMARK'{} <- AltTypeList2] of
2480
%% [] when ExtensionDefault == 'IMPLIED' ->
2481
%% AltTypeList2 ++ [#'EXTENSIONMARK'{}];
2485
%% {AltTypeList3,Rest5}.
2488
%% parse_AlternativeTypeList(Tokens) ->
2489
%% parse_AlternativeTypeList(Tokens,[]).
2491
%% parse_AlternativeTypeList(Tokens,Acc) ->
2492
%% {NamedType,Rest} = parse_NamedType(Tokens),
2494
%% [{',',_},Id = {identifier,_,_}|Rest2] ->
2495
%% parse_AlternativeTypeList([Id|Rest2],[NamedType|Acc]);
2497
%% {lists:reverse([NamedType|Acc]),Rest}
2502
%% parse_ExtensionAdditionAlternativeList(Tokens) ->
2503
%% parse_ExtensionAdditionAlternativeList(Tokens,[]).
2505
%% parse_ExtensionAdditionAlternativeList([{'[[',_}|Rest],Acc) ->
2506
%% parse_ExtensionAdditionAlternativeList(Rest,Acc);
2507
%% parse_ExtensionAdditionAlternativeList(Tokens = [{identifier,_,_}|_Rest],Acc) ->
2508
%% {Element,Rest0} = parse_NamedType(Tokens);
2510
%% [{',',_}|Rest01] ->
2511
%% parse_ExtensionAdditionAlternativeList(Rest01,[Element|Acc]);
2513
%% {lists:reverse([Element|Acc]),Rest0}
2516
%% parse_ExtensionAdditionAlternatives([{'[[',_}|Rest]) ->
2517
%% parse_ExtensionAdditionAlternatives(Rest,[]);
2518
%% parse_ExtensionAdditionAlternatives(Tokens) ->
2519
%% throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
2520
%% [got,get_token(hd(Tokens)),expected,'[[']}}).
2522
%% parse_ExtensionAdditionAlternatives([Id = {identifier,_,_}|Rest],Acc) ->
2523
%% {NamedType, Rest2} = parse_NamedType([Id|Rest]),
2525
%% [{',',_}|Rest21] ->
2526
%% parse_ExtensionAdditionAlternatives(Rest21,[NamedType|Acc]);
2527
%% [{']]',_}|Rest21] ->
2528
%% {lists:reverse(Acc),Rest21};
2530
%% throw({asn1_error,{get_line(hd(Rest2)),get(asn1_module),
2531
%% [got,get_token(hd(Rest2)),expected,[',',']]']]}})
2347
2534
parse_NamedType([{identifier,L1,Idname}|Rest]) ->
2348
2535
{Type,Rest2} = parse_Type(Rest),
2355
2542
parse_ComponentTypeLists(Tokens) ->
2356
% Resulting tuple {ComponentTypeList,Rest1} is returned
2358
[{identifier,_,_}|_Rest0] ->
2359
{Clist,Rest01} = parse_ComponentTypeList(Tokens),
2362
parse_ComponentTypeLists(Rest02,Clist); % 5 - 13
2366
[{'COMPONENTS',_},{'OF',_}|_Rest] ->
2367
{Clist,Rest01} = parse_ComponentTypeList(Tokens),
2370
parse_ComponentTypeLists(Rest02,Clist);
2543
parse_ComponentTypeLists(Tokens,[]).
2545
parse_ComponentTypeLists(Tokens = [{identifier,_,_}|_Rest0],Clist) ->
2546
{CompList,Rest1} = parse_ComponentTypeList(Tokens,[]),
2547
parse_ComponentTypeLists(Rest1,Clist++CompList);
2548
parse_ComponentTypeLists(Tokens = [{'COMPONENTS',_},{'OF',_}|_Rest],Clist) ->
2549
{CompList,Rest1} = parse_ComponentTypeList(Tokens,[]),
2550
parse_ComponentTypeLists(Rest1,Clist++CompList);
2551
parse_ComponentTypeLists([{'...',L1},{'!',_}|Rest02],Clist0) ->
2552
{_,Rest03} = parse_ExceptionIdentification(Rest02),
2553
%% Exception info is currently thrown away
2554
parse_ComponentTypeLists2(Rest03,Clist0++[#'EXTENSIONMARK'{pos=L1}]);
2555
parse_ComponentTypeLists([{',',L1},{'...',_},{'!',_}|Rest02],Clist0) when Clist0 =/= []->
2556
{_,Rest03} = parse_ExceptionIdentification(Rest02),
2557
%% Exception info is currently thrown away
2558
parse_ComponentTypeLists2(Rest03,Clist0++[#'EXTENSIONMARK'{pos=L1}]);
2560
parse_ComponentTypeLists([{',',_},{'...',L1}|Rest02],Clist0) when Clist0 =/= []->
2561
parse_ComponentTypeLists2(Rest02,Clist0++[#'EXTENSIONMARK'{pos=L1}]);
2562
parse_ComponentTypeLists([{'...',L1}|Rest02],Clist0) ->
2563
parse_ComponentTypeLists2(Rest02,Clist0++[#'EXTENSIONMARK'{pos=L1}]);
2564
parse_ComponentTypeLists(Tokens = [{'}',_L1}|_Rest02],Clist0) ->
2567
parse_ComponentTypeLists2(Tokens,Clist) ->
2568
{ExtAdd,Rest} = parse_ExtensionAdditions(Tokens,Clist),
2569
{Clist2,Rest2} = parse_OptionalExtensionMarker(Rest,lists:flatten(ExtAdd)),
2572
{CompList,Rest4} = parse_ComponentTypeList(Rest3,[]),
2573
{Clist2 ++ CompList,Rest4};
2375
parse_ComponentTypeLists(Tokens,[])
2378
parse_ComponentTypeLists([{'...',L1},{'!',_}|Rest],Clist1) ->
2379
{_,Rest2} = parse_ExceptionIdentification(Rest),
2380
%% Exception info is currently thrown away
2381
parse_ComponentTypeLists2(Rest2,Clist1++[#'EXTENSIONMARK'{pos=L1}]);
2382
parse_ComponentTypeLists([{'...',L1}|Rest],Clist1) -> %% first Extensionmark
2383
parse_ComponentTypeLists2(Rest,Clist1++[#'EXTENSIONMARK'{pos=L1}]);
2384
parse_ComponentTypeLists(Tokens,Clist1) ->
2388
parse_ComponentTypeLists2(Tokens,Clist1) ->
2389
{ExtensionAddition,Rest2} =
2392
parse_ExtensionAdditionList(Rest1);
2396
{OptionalExtensionMarker,Rest3} =
2398
[{',',_},{'...',L2}|Rest21] ->
2399
{[#'EXTENSIONMARK'{pos=L2}],Rest21};
2403
{RootComponentTypeList,Rest4} =
2406
parse_ComponentTypeList(Rest31);
2410
{Clist1 ++ ExtensionAddition ++ OptionalExtensionMarker ++ RootComponentTypeList, Rest4}.
2413
parse_ComponentTypeList(Tokens) ->
2414
parse_ComponentTypeList(Tokens,[]).
2416
parse_ComponentTypeList(Tokens,Acc) ->
2578
parse_OptionalExtensionMarker([{',',_},{'...',L1}|Rest],Clist)->
2579
{Clist++[#'EXTENSIONMARK'{pos=L1}],Rest};
2580
parse_OptionalExtensionMarker(Tokens,Clist) ->
2584
parse_ComponentTypeList([{',',_},Id = {identifier,_,_}|Rest],Acc) when Acc =/= [] ->
2585
{ComponentType,Rest2} = parse_ComponentType([Id|Rest]),
2586
parse_ComponentTypeList(Rest2,[ComponentType|Acc]);
2587
parse_ComponentTypeList([{',',_},C1={'COMPONENTS',_},C2={'OF',_}|Rest],Acc) when Acc =/= [] ->
2588
{ComponentType,Rest2} = parse_ComponentType([C1,C2|Rest]),
2589
parse_ComponentTypeList(Rest2,[ComponentType|Acc]);
2590
parse_ComponentTypeList(Tokens = [{'}',_}|_],Acc) ->
2591
{lists:reverse(Acc),Tokens};
2592
parse_ComponentTypeList(Tokens = [{']',_},{']',_}|_],Acc) ->
2593
{lists:reverse(Acc),Tokens};
2594
parse_ComponentTypeList(Tokens = [{',',_},{'...',_}|_],Acc) ->
2595
{lists:reverse(Acc),Tokens};
2596
parse_ComponentTypeList(Tokens,[]) ->
2417
2597
{ComponentType,Rest} = parse_ComponentType(Tokens),
2598
parse_ComponentTypeList(Rest,[ComponentType]);
2599
parse_ComponentTypeList(Tokens,_) ->
2601
{get_line(hd(Tokens)),get(asn1_module),
2602
[got,[get_token(hd(Tokens)),get_token(hd(tl(Tokens)))],
2603
expected,['}',', identifier']]}}).
2605
parse_ExtensionAdditions(Tokens=[{',',_}|_],Clist) ->
2606
{ExtAddList,Rest2} = parse_ExtensionAdditionList(Tokens,[]),
2607
{Clist++ExtAddList,Rest2};
2608
parse_ExtensionAdditions(Tokens,Clist) ->
2612
parse_ExtensionAdditionList([{',',_},Id = {identifier,_,_}|Rest],Acc) ->
2613
{ComponentType,Rest2} = parse_ComponentType([Id|Rest]),
2614
parse_ExtensionAdditionList(Rest2,[ComponentType|Acc]);
2615
parse_ExtensionAdditionList([{',',_},C1={'COMPONENTS',_},C2={'OF',_}|Rest],Acc) ->
2616
{ComponentType,Rest2} = parse_ComponentType([C1,C2|Rest]),
2617
parse_ExtensionAdditionList(Rest2,[ComponentType|Acc]);
2618
parse_ExtensionAdditionList([{',',_},C1 = {'[',_},C2 = {'[',_}|Rest],Acc) ->
2619
{ExtAddGroup,Rest2} = parse_ExtensionAdditionGroup([C1,C2|Rest],[]),
2620
parse_ExtensionAdditionList(Rest2,[ExtAddGroup|Acc]);
2621
parse_ExtensionAdditionList(Tokens = [{'}',_}|_],Acc) ->
2622
{lists:reverse(Acc),Tokens};
2623
parse_ExtensionAdditionList(Tokens = [{',',_},{'...',_}|_],Acc) ->
2624
{lists:reverse(Acc),Tokens};
2625
parse_ExtensionAdditionList(Tokens,_) ->
2627
{get_line(hd(Tokens)),get(asn1_module),
2628
[got,[get_token(hd(Tokens)),get_token(hd(tl(Tokens)))],
2629
expected,['}',', identifier']]}}).
2632
parse_ExtensionAdditionGroup([ {'[',_},{'[',_},_VsnNr = {number,_,Num},{':',_}|Rest],[]) ->
2633
parse_ExtensionAdditionGroup2(Rest,Num);
2634
parse_ExtensionAdditionGroup([ {'[',_},{'[',_}|Rest],[]) ->
2635
parse_ExtensionAdditionGroup2(Rest,undefined);
2636
parse_ExtensionAdditionGroup(Tokens,_) ->
2638
{get_line(hd(Tokens)),get(asn1_module),
2639
[got,[get_token(hd(Tokens)),get_token(hd(tl(Tokens)))],
2640
expected,['[[']]}}).
2643
parse_ExtensionAdditionGroup2(Tokens,Num) ->
2644
{CompTypeList,Rest} = parse_ComponentTypeList(Tokens,[]),
2419
[{',',_},Id = {identifier,_,_}|Rest2] ->
2420
parse_ComponentTypeList([Id|Rest2],[ComponentType|Acc]);
2421
[{',',_},C1={'COMPONENTS',_},C2={'OF',_}|Rest2] ->
2422
parse_ComponentTypeList([C1,C2|Rest2],[ComponentType|Acc]);
2424
% {lists:reverse([ComponentType|Acc]),Rest}
2426
{lists:reverse([ComponentType|Acc]),Rest};
2427
% [{',',_},{'...',_},{'}',_}|_] ->
2428
% {lists:reverse([ComponentType|Acc]),Rest};
2429
[{',',_},{'...',_}|_] ->%% here comes the dubble ellipse
2430
{lists:reverse([ComponentType|Acc]),Rest};
2433
{get_line(hd(Tokens)),get(asn1_module),
2434
[got,[get_token(hd(Rest)),get_token(hd(tl(Rest)))],
2435
expected,['}',', identifier']]}})
2439
parse_ExtensionAdditionList(Tokens) ->
2440
parse_ExtensionAdditionList(Tokens,[]).
2442
parse_ExtensionAdditionList(Tokens,Acc) ->
2445
[{identifier,_,_}|_Rest] ->
2446
parse_ComponentType(Tokens);
2447
[{'[',_},{'[',_}|_] ->
2448
parse_ExtensionAdditions(Tokens);
2449
[{'...',L1}|_Rest] ->
2450
{#'EXTENSIONMARK'{pos=L1},Tokens};
2452
throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
2453
[got,get_token(hd(Tokens)),expected,
2454
[identifier,'[[']]}})
2458
parse_ExtensionAdditionList(Rest01,[Element|Acc]);
2459
[{'...',_}|Rest01] ->
2460
{lists:reverse([Element|Acc]),Rest01};
2462
{lists:reverse([Element|Acc]),Rest0}
2465
parse_ExtensionAdditions([{'[',_},{'[',_}|Rest]) ->
2466
parse_ExtensionAdditions(Rest,[]);
2467
parse_ExtensionAdditions(Tokens) ->
2468
throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
2469
[got,get_token(hd(Tokens)),expected,'[[']}}).
2471
parse_ExtensionAdditions([_VsnNr = {number,_,_},{':',_}|Rest],Acc) ->
2472
%% ignor version number for now
2473
parse_ExtensionAdditions(Rest,Acc);
2474
parse_ExtensionAdditions([Id = {identifier,_,_}|Rest],Acc) ->
2475
{ComponentType, Rest2} = parse_ComponentType([Id|Rest]),
2478
parse_ExtensionAdditions(Rest21,[ComponentType|Acc]);
2479
[{']',_},{']',_}|Rest21] ->
2480
{lists:reverse(Acc),Rest21};
2482
throw({asn1_error,{get_line(hd(Rest2)),get(asn1_module),
2483
[got,get_token(hd(Rest2)),expected,[',',']]']]}})
2485
parse_ExtensionAdditions(Tokens,_) ->
2486
throw({asn1_error,{get_line(hd(Tokens)),get(asn1_module),
2487
[got,get_token(hd(Tokens)),expected,identifier]}}).
2646
[{']',_},{']',_}|Rest2] ->
2647
{[{'ExtensionAdditionGroup',Num}|CompTypeList] ++
2648
['ExtensionAdditionGroupEnd'],Rest2};
2650
throw({asn1_error,{get_line(hd(Rest)),get(asn1_module),
2651
[got,get_token(hd(Rest)),expected,[']]']]}})
2489
2655
parse_ComponentType([{'COMPONENTS',_},{'OF',_}|Rest]) ->
2490
2656
{Type,Rest2} = parse_Type(Rest),
2491
2657
{{'COMPONENTS OF',Type},Rest2};
2492
2658
parse_ComponentType(Tokens) ->
2493
{NamedType,Rest} = parse_NamedType(Tokens),
2659
Result = {NamedType,Rest} = parse_NamedType(Tokens),
2495
2661
[{'OPTIONAL',_}|Rest2] ->
2496
2662
{NamedType#'ComponentType'{prop='OPTIONAL'},Rest2};
2512
2678
[got,get_token(hd(Tokens)),expected,
2513
2679
[number,'-number']]}}).
2515
parse_Enumerations(Tokens=[{identifier,_,_}|_Rest]) ->
2516
parse_Enumerations(Tokens,[]);
2517
parse_Enumerations([H|_T]) ->
2681
parse_Enumerations(Tokens=[{identifier,_,_}|_Rest],ExtensionDefault) ->
2682
parse_Enumerations(Tokens,[],ExtensionDefault);
2683
parse_Enumerations([H|_T],_) ->
2518
2684
throw({asn1_error,{get_line(H),get(asn1_module),
2519
2685
[got,get_token(H),expected,identifier]}}).
2521
parse_Enumerations(Tokens = [{identifier,_,_},{'(',_}|_Rest], Acc) ->
2687
parse_Enumerations(Tokens = [{identifier,_,_},{'(',_}|_Rest], Acc, ExtensionDefault) ->
2522
2688
{NamedNumber,Rest2} = parse_NamedNumber(Tokens),
2524
2690
[{',',_}|Rest3] ->
2525
parse_Enumerations(Rest3,[NamedNumber|Acc]);
2691
parse_Enumerations(Rest3,[NamedNumber|Acc], ExtensionDefault);
2692
_ when ExtensionDefault == 'IMPLIED'->
2693
{lists:reverse(['EXTENSIONMARK',NamedNumber|Acc]),Rest2};
2527
2695
{lists:reverse([NamedNumber|Acc]),Rest2}
2529
parse_Enumerations([{identifier,_,Id}|Rest], Acc) ->
2697
parse_Enumerations([{identifier,_,Id}|Rest], Acc, ExtensionDefault) ->
2531
2699
[{',',_}|Rest2] ->
2532
parse_Enumerations(Rest2,[Id|Acc]);
2700
parse_Enumerations(Rest2,[Id|Acc], ExtensionDefault);
2701
_ when ExtensionDefault == 'IMPLIED' ->
2702
{lists:reverse(['EXTENSIONMARK', Id |Acc]),Rest};
2534
2704
{lists:reverse([Id|Acc]),Rest}
2536
parse_Enumerations([{'...',_}|Rest], Acc) ->
2706
parse_Enumerations([{'...',_}|Rest], Acc, _ExtensionDefault) ->
2538
2708
[{',',_}|Rest2] ->
2539
parse_Enumerations(Rest2,['EXTENSIONMARK'|Acc]);
2709
parse_Enumerations(Rest2,['EXTENSIONMARK'|Acc],undefined);
2541
2711
{lists:reverse(['EXTENSIONMARK'|Acc]),Rest}
2543
parse_Enumerations([H|_T],_) ->
2713
parse_Enumerations([H|_T],_,_) ->
2544
2714
throw({asn1_error,{get_line(H),get(asn1_module),
2545
2715
[got,get_token(H),expected,identifier]}}).