Comments 25
Спасибо, прочитал на одно дыхании. Продолжайте в том же духе))
+3
UFO just landed and posted this here
Спасибо за статью.
P.S. Code Conventions наверное не читали? Тестов не хватает в проекте, нормальных junit-тестов, хотя бы.
P.S. Code Conventions наверное не читали? Тестов не хватает в проекте, нормальных junit-тестов, хотя бы.
+1
> посоветуйте пожалуйста хостинг, куда можно залить архив код
github.com, bitbucket.org
github.com, bitbucket.org
+2
Я, глядя на иллюстрацию, ждал от статьи большего.
+8
> Хочу поделится с вами реализацией алгоритма «Метод рекурсивного спуска» на примере написания парсера формул с поддержкой переменных и функций на языке Java
Складывается впечатление, что вы не до конца понимаете разницу между алгоритмом для решение конкретной задачи и общей для многих задач идеей.
Иными словами, некорректно говорить об алгоритме «Метод рекурсивного спуска».
Складывается впечатление, что вы не до конца понимаете разницу между алгоритмом для решение конкретной задачи и общей для многих задач идеей.
Иными словами, некорректно говорить об алгоритме «Метод рекурсивного спуска».
+4
Согласен с Вами, возможно я несколько не так выразился. Наверное было бы лучше написать:
«Хочу поделится с вами реализацией парсера математических формул с поддержкой переменных и функций на основе алгоритма „Метод рекурсивного спуска“?
«Хочу поделится с вами реализацией парсера математических формул с поддержкой переменных и функций на основе алгоритма „Метод рекурсивного спуска“?
0
Задача хорошая, на 1м курсе такое решали. Рекомендую вам поработать над дизайном кода.
+1
Неделя парсинга формул на хабре!
-4
И ни слова про грамматики. Советую, вместо того чтобы читать подобные статьи в интернете, взять нормальную книжку по теме.
+10
Честно говоря не понял в чем тут заключается метод рекурсивного спуска, какой-то код, что-то в него вносим, что-то он выдает.
Кстати, как сказали выше, о термах, грамматике ни слова.
Кстати, как сказали выше, о термах, грамматике ни слова.
+2
Но Вы ведь знаете о существующих готовых парсерах грамматики? Например, ANTLR, с которым весь описанный выше функционал (парсинг выражений вида "(1+2)*3+4*5+6*sin(0.7)") выражается несколько проще:
grammar extcalc;
/*------------------------------------------------------------------
* PARSER RULES
*------------------------------------------------------------------*/
expr : plusminus* EOF ;
plusminus
: multdiv ( ( '+' | '-' ) multdiv )* ;
multdiv : factor ( ( '*' | '/' ) factor )* ;
factor : NUMBER | func | '(' plusminus ')' ;
func : NAME '(' plusminus ')' ;
/*------------------------------------------------------------------
* LEXER RULES
*------------------------------------------------------------------*/
NUMBER : (DIGIT)+ ('.' (DIGIT)+)* ;
NAME : (ALPHA)+ ;
WHITESPACE : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+ { $channel = HIDDEN; } ;
fragment DIGIT : '0'..'9' ;
fragment ALPHA : 'a'..'z' ;
+8
Я думаю, автор ставил целью описать, как именно работает анализатор, изнутри. Готовые парсеры тут ни к месту. Но у него это, на мой взгляд, получилось не слишком хорошо — отсутствуют любые признаки теории.
Вообще, в этой теме, код — совсем не главное, потому что он получается довольно простой. Важно знание основ.
Вообще, в этой теме, код — совсем не главное, потому что он получается довольно простой. Важно знание основ.
+1
Всё-таки, в реальных случаях лучше использовать нормальные решения по парзингу, а не рекурсивный спуск. Мне до сих пор стыдно за то, что в DN OSP используется мой старый вычислитель на базе рекурсивного спуска :(
+3
Почему он "--" понимает, а "**" нет?
0
например: есть выражение: 4--4
Парсер воспринимает это как: 4 — (-4), а что должно значить **?
Кстати заметьте, 4++4 он также не пропустит
Парсер воспринимает это как: 4 — (-4), а что должно значить **?
Кстати заметьте, 4++4 он также не пропустит
0
а что это у вас за формула для привлечения внимания?
0
Sign up to leave a comment.
Парсер формул с помощью метода рекурсивного спуска