2013-04-24 1 views
3

У меня есть простой язык, как:синтаксического анализа и оценки простой язык с помощью JavaCC

funa X (X+3*funb(1)) ; 
funb Y (2*Y) ; 
main (2+func(func(1))) ; 
func A (funa(A)) ; 

я использовал CFG для разбора выше, как:

program => (statement)+ 
statement => (<main_keyword> | <idl> <idu>) <lparan> expression <rparan> <semicolon> 
expression => T(<plus> T)* 
T   => P(<multipliation>P)* 
P   => <idu> | <idl> <lparan> expression <rparan> | <number> 

И фишку признание:

<main_keyword> -> "main" 
<idl>   -> (["a"-"z"])+ 
<idu>   -> (["A"-"Z"])+ 
<lparan>   -> "(" 
<rparan>   -> ")" 
<semicolon>  -> ";" 
<number>   -> (["0"-"9"])+ 
<plus>   -> "+" 
<multiplication> -> "*" 

I я могу разобрать выше, используя javaCC, но у меня нет идеи, как оценивать выше такие программы с помощью парсера. Вышеуказанная программа должна оцениваться до 15. Как реализовать это в javaCC, возможно ли это с помощью увеличения производительности парсера? Функции могут появляться в любом месте, перед вызовом или после вызова.

Благодаря

ответ

3

Вы можете сделать это, позволяя JavaCC создать AST для вас , а затем создать пользовательские узлы в то время как вы ходите по дереву. Как только ваше дерево будет построено, вы вызываете метод корневого узла eval(...) для оценки всего выражения/дерева.

демо, как оценивать простые выражения с JavaCC + JJTree: http://www.cs.nmsu.edu/~rth/cs/cs471/InterpretersJavaCC.html

более обширный пример, в том числе функции: https://github.com/bkiers/Curta


https://javacc.java.net/doc/JJTree.html

 Смежные вопросы

  • Нет связанных вопросов^_^