Как по мне компиляторы тема сложная. Уже не первый день(год) изучаю, но постоянно, а периодично, наплывами.
Как то она мне не трудно дается.
Теорию почерпни тут.
http://www.intuit.ru/department/sa/comp ... dev_7.htmlИспользуй свертку. А для "," и "=" применяй левую ассоциативность.
y=(4*x-x^2)/4,x0=2
Вначале пройдемся лексическим анализатором получим.
id1=(num1*id2-id2^num2)/num3,id3=num2
заносим в стек
id1=(num1*id2
Существут такая граматика выполняем свертку.
id1=(term
(*,.,.)
(num1,nil,nil)(id1,nil,nil)
id1=(term-id2^num2 выполняем свертку
id1=(term-exp
(*,.,.) (^,.,.)
(num1,nil,nil)(id1,nil,nil) (id2,nil,nil)(num2,nil,nil)
id1=(term-exp снова свертка
id=(expr
(-,.,.)
(*,.,.) (^,.,.)
(num1,nil,nil)(id1,nil,nil) (id2,nil,nil)(num2,nil,nil)
заносим скобку в стек
id=(expr) и выполняем светку
id=factor
('()',nil,.)
('-',.,.)
('*',.,.) ('^',.,.)
(num1,nil,nil)(id1,nil,nil) (id2,nil,nil)(num2,nil,nil)
заносим скобку в стек /
id=factor/num3 снова свертка.
id=term
('/',.,.)
('()',nil,.) (num3,nil,nil)
('-',.,.)
('*',.,.) ('^',.,.)
(num1,nil,nil)(id1,nil,nil) (id2,nil,nil)(num2,nil,nil)
снова сввертка id=term в Stmt.
Stmt
('=',.,.)
('/',.,.)
('()',nil,.) (num3,nil,nil)
('-',.,.)
('*',.,.) ('^',.,.)
(num1,nil,nil)(id1,nil,nil) (id2,nil,nil)(num2,nil,nil)
заносим ',' в стек
Stmt,
сново заносим d в стек.
Stmt,id3
тут надо быть по оккуратние что у нас с громатикой. Если такой нет то заносим дальше.
Stmt,id3=num3 делаем сверку и еще одну свертку
('запятая',.,.)
('=',.,.) ('=',.,.)
('/',.,.)
('()',nil,.) (num3,nil,nil)
('-',.,.)
('*',.,.) ('^',.,.)
(num1,nil,nil)(id1,nil,nil) (id2,nil,nil)(num2,nil,nil)
И там справа не поместилоcь
(id3,nil,nil)
(num2,nil,nil)
Часть операций опущенно, а то и так долго.