Comments (2)
Согласен с наблюдением, но не полностью согласен с выводом.
Почему сделано именно так. Это сделано для того чтобы правильно обрабатывать приоритет операций, согласно таблице приоритетов.
Например есть выражение 2 + 3 * 4
. Парсер написанный как v7, то есть recursive descent, будет выглядеть так:
double parse_expr(p) {
double result = parse_term(p)
while (op == '+' || op == '-') result += parse_term(p); // or -=
return result;
};
double parse_term(p) {
double result = parse_number(p)
while (op == '*' || op == '/') result *= parse_number(p); // or /=
return result;
};
Такой парсер автоматически посчитает выражение правильно, потому что сначала перемножит числа а потом сложит результаты. Почему это так? Потому что менее приоритетный оператор, для которого есть функция, вызовет более приоритетный. V7 делает точно так - для каждого приоритета есть функция, и они по лесенке друг друга вызывают. Так как выражения обычно содержат не все возможные операции, а только несколько, то большинство функций просто вызывают друг друга без каких-либо действий. То есть издержки - это фрейм функции на стеке.
Делать вызовы на одном уровне конечно можно, но тогда придется писать код для правильной поддержки приоритетов. То есть парсить выражение, сортировать операции по приоритетам, и потом выполнять. Cложность парсера существенно вырастет, и я не совсем уверен в выигрыше по размеру стека.
Издержки на фрейм функции по идее не очень большие, хотя нужно прикинуть.
from v7.
Obsolete
from v7.
Related Issues (20)
- V7 ScriptBASIC integration on Windows 7 32 bit HOT 41
- unit_test fails HOT 3
- v7_next_prop - No property attributes being returned HOT 10
- Script BASIC HOT 9
- v7.c: line:29703 /* TODO(dfrank) : add getter/setter support */ HOT 1
- How to load the byte code generated by v7_compile? HOT 4
- Can't call js function from C HOT 13
- Make user_data property as _V7_PROPERTY_OFF_HEAP HOT 1
- Problem running a basic test program HOT 2
- Segmentation Faults 2017-05-09
- Can I run under iOS? And Is it thread safe? HOT 2
- v7 support ajax?
- Trouble passing "true", "false" and "null" HOT 3
- v7_array_length issue HOT 1
- link errors since commit 8d8d8ce5... HOT 1
- Developer Centre down?
- C program crashes when trying to retrieve one of struct members as object member if below 0 HOT 4
- v7 Optimization tips
- Linker errors: Undefined symbols for architecture x86_64
- JSON.parse error
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from v7.