#c# #lr
#c# #lr
Вопрос:
У меня есть грамматика LR и таблица LR для таких выражений, как (1 1), 1 (a 1)
0: E’->E
1: E ->E T
2: E-> T
3: T -> T * F
4: T-> F
5: F ->( E)
6: F-> id
string[,] ActionTable =
// * ( ) id end E T F
{
{"" ,"" ,"S4" ,"" ,"S5" ,"" ,"1" ,"2" ,"3"}, // 0
{"S6" ,"" ,"" ,"" ,"" ,"AC" ,"" ,"" ,"" }, // 1
{"R2" ,"S7" ,"" ,"R2" ,"" ,"R2" ,"" ,"" ,""},//2
{"R4" ,"R4" ,"" ,"R4" ,"" ,"R4" ,"" ,"" ,""}, // 3
{"" ,"" ,"S4" ,"" ,"S5" ,"" ,"8" ,"2" ,"3"}, // 4
{"R6" ,"R6" ,"" ,"R6" ,"" ,"R6" ,"" ,"" ,""}, // 5
{"" ,"" ,"S4" ,"" ,"S5" ,"" ,"" ,"9" ,"3"}, // 6
{"" ,"" ,"S4" ,"" ,"S5" ,"" ,"" ,"" ,"10"},// 7
{"S6" ,"" ,"" ,"S11" ,"" ,"" ,"" ,"" ,""}, // 8
{"R1" ,"S7" ,"" ,"R1" ,"R1" ,"" ,"" ,"" ,""}, // 9
{"R3" ,"R3" ,"" ,"R3" ,"R3" ,"" ,"" ,"" ,""}, //10
{"R5" ,"R5" ,"" ,"R5" ,"R5" ,"" ,"" ,"" ,""} //11
};
Я пытаюсь проверить выражение типа 1 1 или 1 (1 * a) 1, но анализатор говорит, что это выражение неверно.
Что я могу сделать с моей грамматикой, чтобы исправить это?
Ответ №1:
У вас нет производственного правила для чисел.
Комментарии:
1. как насчет E -> E T, T-> F , F-> id ?
2. Это хороший довод. Предполагается, что
id
это сопоставляется только с переменными.3. Может быть, мне следует изменить свою грамматику?