vad23klev / lua-java-translator Goto Github PK
View Code? Open in Web Editor NEWLua java byte code translator
License: GNU General Public License v2.0
Lua java byte code translator
License: GNU General Public License v2.0
Никит, при создании таблицы можно же впихнуть в нее функцию?
На этапе генерации кода понадобится быстрый доступ ко многим параметрам. Нужно добавить атрибуты узлам дерева с этими параметрами.
Для функций Lua:
Для константы:
Это то, что я сейчас делаю. Если что-то еще, на твой взгляд, нужно - напиши.
Никит, надо добавить функции, в узлы дерева и парвила свертки.
Никит, исправил, почти все...
%{
#include <stdio.h>
#include <tree_nodes.h>
%}
%union {
int Int;
char* Id;
char* String;
double Double;
struct NWhile * While;
struct NExpr * Expr;
struct NFor * For;
struct NStmtList * SL;
struct NStmt * Stmt;
struct NFunc * Func;
}
%start root
%token INT
%token DOUBLE
%token FOR
%token WHILE
%token END
%token IF
%token ELSE
%token ELSEIF
%token DO
%token THEN
%token REPEAT
%token UNTIL
%token RETURN
%token BREAK
%token FUNC
%token LOCAL
%token STRING
%token ID
%token EQ
%token NQ
%token LT
%token GT
%token AND
%token NOT
%token OR
%token CONCAT
%token TRUE
%token FALSE
%token NIL
%type expr
%type stmts
%type func
%right '='
%left OR
%left AND
%left EQ NQ
%left '<' '>' GT LT
%left '+' '-'
%left '*' '/' '%'
%left NOT
%nonassoc ')'
%%
argsn: expr
| argsn ',' expr
;
args: /* empty /
| argsn
;
longid: ID
| longid '.' ID
;
expr: expr AND expr
| expr OR expr
| NOT expr
| expr EQ expr
| expr NQ expr
| expr '>' expr
| expr '<' expr
| expr GT expr
| expr LT expr
| longid '(' args ')'
| longid args
| expr '+' expr
| expr '-' expr
| expr '' expr
| expr '/' expr
| expr '%' expr
| expr CONCAT expr
| '(' expr ')'
| longid '[' expr ']'
| STRING
| INT
| DOUBLE
;
stmt: WHILE expr stmts END
| IF expr THEN stmts END
| IF expr THEN stmts ELSE stmts END
| IF expr THEN stmts ELSEIF expr stmts END
| FOR ID '=' expr ',' expr DO stmts END
| FOR ID '=' expr ',' expr ',' expr DO stmts END
| expr
| func
| longid '=' tbl
;
stmtsn: stmt
| stmtsn stmt
;
stmts: /* empty */
| stmtsn
;
root: stmts
;
func: FUNC ID '(' func_args_e ')' stmts END
| FUNC ID ':' ID '(' func_args_e ')' stmts END
;
func_args: longid
| func_args ',' longid
;
func_args_e: /* empty */
| func_args
;
tbl_elem: ID '=' expr
| '[' expr ']' '=' expr
| expr
| func
| ID '=' func
| '[' expr ']' func
;
tbl_elem_list: /* empty */
| tbl_elem_listn
;
tbl_elem_listn: tbl_elem
| tbl_elem_listn ',' tbl_elem
;
tbl: '{' tbl_elem_list '}'
;
Есть такой пример:
function shellsort(t, before, n)
n = n
k,z,c,v = 0x3F,'sada\n\"',"sdda\\\"\n", [[
sdasd asd asd asd asd
dasdasd \n\"]]
if not before or before == "<" then return ssup(t, n)
elseif before == ">" then return ssdown(t, n)
else return ssgeneral(t, n, before)
end
return shellsort
end
Нужно добавить правило для подержки такого объявления переменных:
k,z,c,v = 0x3F,'sada\n\"',"sdda\\\"\n", [[
sdasd asd asd asd asd
dasdasd \n\"]]
В файл с лексером нужно подключить файл .h сгенерированный парсером, и возращать значения.
Необходимо обойти дерево и исправить его в целях семмантики.
Есть мнение что от данного файла пора избавиться. Или переименовать lua2.y в lua.y
Никит, у меня к тебе вопрос. не могу подключить файл к лексеру что бы печатался.
make
rm -rf *.o *.h *.c lualp
bison -d ../parser/lua2.y
cp ../parser/tree_nodes.h ./
cp ../parser/tree_print.h ./
g++ -c lua2.tab.c
flex ../lexer/lua.yy
g++ -c lex.yy.c
g++ lex.yy.o lua2.tab.o -o lualp
lex.yy.o: In function `main':
lex.yy.c:(.text+0x28dd): undefined reference to `print_tree(NStmtList*)'
collect2: error: ld returned 1 exit status
Makefile:4: recipe for target 'lualp' failed
make: *** [lualp] Error 1
}
подключение и вызов в лексере
%{
#include <stdio.h>
#include <string.h>
#include "lua2.tab.h"
#include "tree_print.h"
#define YY_USER_ACTION yylloc.first_line = yylloc.last_line = yylineno;
char strconst[1281] = {0};
extern int yyparse(void);
%}
int main(int argc,char* argv[])
{
if (argc > 1)
{
yyin = fopen(argv[1], "r");
yyparse();
print_tree(root);
}
return 0;
}
Никит объявление именнованных функций в таблицах тоже надо переносить в верх
Как минимум учитывать текущую строку.
Блокирует Issue #15.
Значения перечислений NStmtType и NExprType переопределяют while, for и т. д., компилятор ругается.
Необходимо добавить префиксы:
enum NStmtType {
STMT_WHILE,
...
enum NExprType {
EXPR_EQ,
...
Ну и форматирование еще бы нормальное. Код функций тоже придется поменять.
Валится на тесте:
--[[ A multiline comment
line2
line3 ]]--
wtf = 5;
Не находит ничего, кроме конца файла.
Никит,вопрос:
Почему в lua.yy используется yylval, а в lua.y yyval?
Они там не к месту. Информация о них понадобится только на этапе семантики.
Разберись с этим:
tree_nodes.h: In function ‘NStmtList* add_stmt_to_list(NStmtList, NStmt*)’:
tree_nodes.h:268:8: error: ‘list’ was not declared in this scope
if(list->first == NULL)
^
tree_nodes.h:276:5: error: ‘list’ was not declared in this scope
list->last = element;
^
tree_nodes.h: In function ‘NFor* create_for(NExpr*, NExpr*, NExpr*, NExpr*, NStmt*)’:
tree_nodes.h:285:19: error: ‘endl’ was not declared in this scope
result->end = endl;
^
Остальное вроде исправил.
нужны, функции создания узлов.
Имя генерируемого класса будет Main
, в нем будет храниться main chunk.
Нужно написать действия к правилам. Сделаю завтра.
Необходимо в программе обработать дерево, и составить сематические таблицы.
Таблиц несколько: таблица констант, таблица классов и др. точно назову вечером.
Нужны тесты, на каждое правило в парсере.
Например:
function fib ( n )
if n < 2 then return 1 end
return fib ( n - 2 ) + fib ( n - 1 )
end
или
function shellsort(t, before, n)
n = n or #t
k,z,c,v = 1.0d,0x3F,'sada\n\"',"sdda\\\"\n", [[
sdasd asd asd asd asd
dasdasd \n\"]]
if not before or before == "<" then return ssup(t, n)
elseif before == ">" then return ssdown(t, n)
else return ssgeneral(t, n, before)
end
end
return shellsort
end
тут есть список спец функций, для метатаблиц.
http://tylerneylon.com/a/learn-lua/
также интересный ключ для таблицы:
t = {key1= 'sdaas', key2='asdsadas'}
t.newkey = 'key3'
в таблице появиться новый ключ
необходимо написать библиотеку стандартных функций.
А вот, лист утверждений должен съедать пустоту?
надо придумать функцию распечатки дерева
Никит, вопрос id_chain - создавать как список утверждений или как цельную строку
'hello "lua ypuser"'wtf = 5;
разбирает не правильно.
В утверждении может содержаться лист утверждений?
Лист утверждений съедает пустоту?
Что осталось по лексеру доделать?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.