|
Парсер математических выражений
|
|||
---|---|---|---|
#18+
Скажем есть выражение авторIF DIR0==2 AND POS0>POS1 AND POS0-POS1>20 THEN VAR0-=100 AND VAR1+=100; Я разбиваю на лемксемы. авторName: IF Type: If Name: DIR0 Type: Alphanumeric Var Type: 3 Num: 0 Name: == Type: Compare Name: 2 Type: Number Name: AND Type: Logic Name: POS0 Type: Alphanumeric Var Type: 4 Num: 0 Name: > Type: Compare Name: POS1 Type: Alphanumeric Var Type: 4 Num: 1 Name: AND Type: Logic Name: POS0 Type: Alphanumeric Var Type: 4 Num: 0 Name: - Type: Operator Name: POS1 Type: Alphanumeric Var Type: 4 Num: 1 Name: > Type: Compare Name: 20 Type: Number Name: THEN Type: Then Name: VAR0 Type: Alphanumeric Var Type: 12 Num: 0 Name: -= Type: Operator Name: 100 Type: Number Name: ; Type: End И потом работаю с массивом лексем. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64.
При простом выражении, cкажем POS0>POS1 AND POS0-POS1>20, все работает хорошо. Но вот такое выражение VAR0=POS0+POS1 уже не работает. Правая часть не присваевается аккумулятивно. Как мне улучшить алгоритм? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2019, 15:48 |
|
Парсер математических выражений
|
|||
---|---|---|---|
#18+
jenya7Как мне улучшить алгоритм? Написать заново Начать с описания грамматики языка ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2019, 09:51 |
|
Парсер математических выражений
|
|||
---|---|---|---|
#18+
Изопропилjenya7Как мне улучшить алгоритм? Написать заново Начать с описания грамматики языка вот поэтому обратился. нужен хороший алгоритм разбирать лексемы. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2019, 10:09 |
|
Парсер математических выражений
|
|||
---|---|---|---|
#18+
jenya7, Рекурсивный спуск ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2019, 10:23 |
|
Парсер математических выражений
|
|||
---|---|---|---|
#18+
jenya7, Посмотри в сторону ANTLR . ... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2019, 10:29 |
|
Парсер математических выражений
|
|||
---|---|---|---|
#18+
jenya7Скажем есть выражение IF DIR0==2 AND POS0>POS1 AND POS0-POS1>20 THEN VAR0-=100 AND VAR1+=100; При простом выражении, cкажем POS0>POS1 AND POS0-POS1>20, все работает хорошо. Но вот такое выражение VAR0=POS0+POS1 уже не работает. Правая часть не присваевается аккумулятивно. Как мне улучшить алгоритм? Смотри. Математическое выражение это Код: sql 1.
В студенческих лабах обычно ограничиваются решением этой задачки черезе ПОЛИЗ. Это просто трансфомация инфиксной формы в стековую (кажется постфикс). И лаба сдаётся. То что ты написал - выходит далеко за рамки просто выражения. Это почти язык где есть conditions. Языки пишутся на генераторах парсеров (lex/yacc/bison/antlr/javacc). Это тема нудная и сложная. Вряд-ли у тебя хватит квалификации быстро это сделать (если это не курсовой проект конечно). Поэтому тебе надо срочно идти к преподу и спрашивать как глубоко тебе надо это делать. Если все-все выражения который к тебе придут будут иметь вид. Код: sql 1.
Тогда твою задачу наверное можно решить на регулярках или на тех псевдо-парсерах как ты делаешь. Но надо точно знать какие еще варианты придут на вход. Это сильно повлияет на твою лабу или курсовую. Комплексность решения сильно зависит от этих кейсов. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2019, 10:40 |
|
Парсер математических выражений
|
|||
---|---|---|---|
#18+
Лексемы в массив это совсем не вариант. Выражение имеет иерархическую суть.Чета раньше чета позже чета в скобках чета нет. Следовательно бинарные деревья тебе в руки к примеру https://www.google.com/search?q=syntax tree&oq=syntax tree&aqs=chrome..69i57j0l5.1095j0j7&sourceid=chrome&ie=UTF-8 А проще взять что нибудь готовое например http://esprima.org/demo/parse.html# ... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2019, 11:41 |
|
Парсер математических выражений
|
|||
---|---|---|---|
#18+
Малыхин СергейЛексемы в массив это совсем не вариант. Выражение имеет иерархическую суть.Чета раньше чета позже чета в скобках чета нет. Следовательно бинарные деревья тебе в руки к примеру https://www.google.com/search?q=syntax tree&oq=syntax tree&aqs=chrome..69i57j0l5.1095j0j7&sourceid=chrome&ie=UTF-8 А проще взять что нибудь готовое например http://esprima.org/demo/parse.html# ну почему не вариант? Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115.
Вполне себе работает. Одна проблема - много места занимает. Даже если хранить в текстовом варианте и парсить при поднятии микроконтролера. Оригинально скрипт должен бежать на микроконтролере. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2019, 09:22 |
|
|
start [/forum/topic.php?fid=16&fpage=9&tid=1339935]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
67ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
others: | 238ms |
total: | 386ms |
0 / 0 |