Мне нужна помощь в написании грамматики парсера LL - PullRequest
0 голосов
/ 20 октября 2019

Я создаю редактор карт.
Поскольку карта использует проприетарный язык, мне нужно создать для нее собственный синтаксический анализатор.

Карта разделена на сектора, где каждый файл представляет сектор,Вот как выглядит небольшая часть типичного секторального файла:

6-27: Refresh, Content={4623}
6-28: Content={4600}
6-29: Content={4602}
6-30: Content={4597}
6-31: Content={4597}
7-0: Content={1316, 1317, 1306}
7-1: ProtectionZone, Content={415, 3198 Charges=5, 2469 Content={2871 Content={2854 Content={3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5}, 2871 Content={3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5}, 2871 Content={3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5}, 2854 Content={3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5}, 2871 Content={3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5}, 2870 Content={3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5}, 2868 Content={3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5}, 2854 Content={3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5}, 2854 Content={3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5, 3198 Charges=5}}}}
7-2: ProtectionZone, Content={415, 3029 Amount=1, 3052, 2992 Amount=5}
7-3: ProtectionZone, Content={415}
7-4: ProtectionZone, Content={415, 3033 Amount=1, 3098, 2981}
7-5: ProtectionZone, Content={415, 3027 Amount=1, 3033 Amount=12, 2981}
7-6: ProtectionZone, Content={415, 3033 Amount=1, 3098, 2981}
7-7: ProtectionZone, Content={415, 1306}
7-8: ProtectionZone, Content={415, 3658, 3661, 3061}
7-9: ProtectionZone, Content={415, 3027 Amount=1, 3440, 3042 Amount=25}
7-10: ProtectionZone, Content={415, 3034 Amount=1, 3032 Amount=19, 3324, 3434}
7-11: ProtectionZone, Content={415, 3034 Amount=1, 3028 Amount=20, 3324, 3434}
7-12: ProtectionZone, Content={415, 2866 Content={3577 Amount=12, 3582 Amount=63, 2867 Content={3582 Amount=100, 3582 Amount=100, 3582 Amount=100, 3582 Amount=100, 3582 Amount=100, 3582 Amount=100, 3582 Amount=100, 3582 Amount=100, 3582 Amount=100}, 3577 Amount=100, 3577 Amount=100, 3577 Amount=100, 2866 Content={3724 Amount=1, 3589 Amount=48, 3594, 3584 Amount=3, 3591 Amount=10, 2977, 2871 Content={3593, 3593, 3593, 3593, 3593, 3593, 3593, 3593, 3593}, 3598 Amount=10, 3586 Amount=26, 3587 Amount=70, 3585 Amount=13, 3597 Amount=5, 3596 Amount=2, 3595 Amount=46, 3590 Amount=16, 3602 Amount=2, 3600 Amount=54}, 2869, 2871, 2864 Content={3731 Amount=19}, 2863 Content={2871 Content={3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100}, 2871 Content={3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100}, 2871 Content={3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100}, 2871 Content={3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100}, 2871 Content={3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100, 3492 Amount=100}}, 3583 Amount=100}}
7-13: ProtectionZone, Content={415, 3010, 3668, 3061}
7-14: Content={415, 1314}
7-15: Content={1316, 1314}
7-16: ProtectionZone, Content={231, 1966}
7-17: Refresh, Content={936, 1967}
7-18: Refresh, Content={231}
7-19: Refresh, Content={231}
7-20: Refresh, Content={4629}
7-21: Refresh, Content={4624}

Я понимаю, что еще не все реализовал, но то, что я до сих пор исправляю?

Этоэто грамматика, которую я написал до сих пор:

tile            ->    num-num: tile_tail

tile_tail       ->    ProtectionZone, tile_tail
                ->    Refresh, tile_tail
                ->    cont

cont            ->    Content={num cont_tail

cont_tail       ->    , num cont_tail
                ->    , num key=num cont_tail
                ->    , num cont cont_tail
                ->    }

key             ->    Amount
                ->    Charges
                ->    PoolLiquidType
                ->    RemainingExpireTime  

num             ->    [0-9]+

Я хочу написать анализатор LL (1), потому что это самый простой подход.

1 Ответ

0 голосов
/ 20 октября 2019

Ваша грамматика не является LL (1): в начале cont_tail одного символа заглядывания недостаточно для различения первых трех альтернатив. (Даже 2 недостаточно.) Тем не менее, вы должны быть в состоянии вычеркнуть эти альтернативы, чтобы получить грамматику LL (1).

...