| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/10/2010 11:09:33
|
rock-skull
JavaBaby
![[Avatar]](/images/avatar/fb4c835feb0a65cc39739320d7a51c02.jpg)
Membro desde: 18/02/2005 23:09:24
Mensagens: 79
Localização: Campinas - SP
Offline
|
Olá. Estou trabalhando em um software que faz parte de um kit didático de manipuladores robóticos que eu estou desenvolvendo. Uma parte desse software é i interpretador de comandos. Basicamente, eu vou pegar alguns comandos do usuário, interpretar, e dependendo do comando enviá-los pela porta serial (atualmente, logo será ethernet) para a placa que controla o robô.
Os comandos são básicos, coisa do tipo:
Inicio;
Move_motor(+250);
Move_robô(+50,-200,+30,0);
Espera_entrada( ;
Abre_Garra;
Fecha_Garra;
Fim;
Talvez, tenha um pouco mais de complexidade, mas é algo que eu ainda vou discutir com meu orientador (o uso ou não de uma linguagem comercial).
Enfim, parando de enrolar, pergunta:
É melhor escrever esse interpretador na mão (já que o comandos são relativamente simples), ou utilizar um parser, como o JavaCC, por exemplo? E caso eu venha usar uma linguagem de robôs comercial (como a VAL) ?
Desde já agradeço aos que puderem ajudar.
This message was edited 1 time. Last update was at 11/10/2010 22:33:54
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/10/2010 11:26:46
|
tinorberto
JavaEvangelist
![[Avatar]](/images/avatar/906b92b2e09a38a0dc5933b4943e87a0.jpg)
Membro desde: 29/10/2008 15:54:46
Mensagens: 344
Localização: Viçosa - Minas Gerais
Offline
|
Pode ser que o java cup te ajude, http://www.cs.princeton.edu/~appel/modern/java/CUP/manual.html
|
Bacharel - Ciência da Computação
Universidade Federal de Viçosa
OCJP 6 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/10/2010 11:29:34
|
davidbuzatto
Moderador
![[Avatar]](/images/avatar/7ba6d33c373fea56b7258003b16c68e5.jpg)
Membro desde: 07/08/2004 23:47:57
Mensagens: 4013
Localização: Vargem Grande do Sul - SP
Offline
|
Depende.
Se seus comandos forem só esses mesmo e você quiser aprender a escrever um parser, recomendo que escreva. Primeiro: sua DSL parece ser simples. Segundo: é uma boa oportunidade de estudar algo mais.
Caso não tenha tempo nem interesse em escrever um parser, use um gereador de parsers (JavaCC, ANTLR, etc.).
Recomendo o ANTLR.
[]´s
|
Seja educado. Agradeça quem te ajudou. Não custa nada.
Dúvidas de Java? Utilize o fórum! Não respondo via MP.
"Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Fowler)
"A vida é um escândalo, e no final dá sempre errado. O que humaniza o homem é o fracasso."
http://davidbuzatto.com.br | GitHub | uHunt | CV Lattes | Last.fm |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/10/2010 11:32:15
|
Mikhas
Virtual Machine Man
![[Avatar]](/images/avatar/4388a23da67b154b780b78dd7ea4636e.jpg)
Membro desde: 17/06/2008 11:10:50
Mensagens: 677
Localização: São Paulo
Offline
|
Se for tudo nesse tipo... pode ser um interpretador simples.. .na minha opinião.
|
Refractor 1.6 - Easy reflection framework
Agora muito mais rapido!
Raze - The fastest CSS selector engine
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/10/2010 12:09:10
|
entanglement
GUJ Hacker
Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline
|
rock-skull wrote:Olá. Estou trabalhando em um software que faz parte de um kit didático de manipuladores robóticos que eu estou desenvolvendo. Uma parte desse software é i interpretador de comandos. Basicamente, eu vou pegar alguns comandos do usuário, interpretar, e dependendo do comando enviá-los pela porta serial (atualmente, logo será ethernet) para a placa que controla o robô.
Os comandos são básicos, coisa do tipo:
Inicio;
Move_motor(+250);
Move_robô(+50,-200,+30,0);
Espera_entrada(  ;
Abre_Garra;
Fecha_Garra;
Fim;
Talvez, tenha um pouco mais de complexidade, mas é algo que eu ainda vou discutir com meu orientador (o uso ou não de uma linguagem comercial).
Enfim, parando de enrolar, pergunta:
É melhor escrever esse interpretador na mão (já que o comandos são relativamente simples), ou utilizar um parser, como o JavaCC, por exemplo? E caso eu venha usar uma linguagem de robôs comercial (como a VAL) ?
Desde já agradeço aos que puderem ajudar.
Você pode usar o interpretador Javascript que o Java já tem (a partir do Java 6.0 - o interpretador é o Rhino).
http://java.sun.com/developer/technicalArticles/J2SE/Desktop/scripting/
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/10/2010 14:48:21
|
rock-skull
JavaBaby
![[Avatar]](/images/avatar/fb4c835feb0a65cc39739320d7a51c02.jpg)
Membro desde: 18/02/2005 23:09:24
Mensagens: 79
Localização: Campinas - SP
Offline
|
Ok. Darei uma olhada nesses parsers generators que vocês indicaram. O tempo tá curto, melhor usar um desses.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/10/2010 14:55:28
|
entanglement
GUJ Hacker
Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline
|
Se o tempo estiver REALMENTE curto, use o tal interpretador Javascript.
Então você terá que fazer um script mais ou menos assim:
Obviamente isso não vai ser compatível com a tal linguagem que você quer implementar. Se realmente seu objetivo é implementar a VAL, você terá de ir pelo caminho que lhe indicaram.
EDIT - obviamente Javascript não é minha linguagem favorita, portanto eu tinha posto um monte de ";" que normalmente não se põem em Javascript.
This message was edited 1 time. Last update was at 11/10/2010 14:56:34
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/10/2010 22:33:12
|
rock-skull
JavaBaby
![[Avatar]](/images/avatar/fb4c835feb0a65cc39739320d7a51c02.jpg)
Membro desde: 18/02/2005 23:09:24
Mensagens: 79
Localização: Campinas - SP
Offline
|
É, pelo o que eu andei ilhando o script, apesar de rápido, não seria a melhor solução, vou nesse ANTRL mesmo. Parece bem interessante, e simples de usar.
Falando nisso, achei esse site: http://javadude.com/articles/antlr3xtut/index.html
Tem um tutorial muito bom do uso do ANTRL com eclipse, em video aulas, bem explicado. Vale a pena conferir.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/10/2010 00:06:56
|
davidbuzatto
Moderador
![[Avatar]](/images/avatar/7ba6d33c373fea56b7258003b16c68e5.jpg)
Membro desde: 07/08/2004 23:47:57
Mensagens: 4013
Localização: Vargem Grande do Sul - SP
Offline
|
Se você for mesmo usar o ANTLR, a gramática a seguir reconhece os programas na sua linguagem.
A gramática pode ainda ser melhorada, fiz do jeito mais simples que me veio na cabeça.
Seguem os diagramas sintáticos. Vou passar o lexer e o parser gerados em outro post.
Parece que fiz essa parte do trabalho para você.
|
| Nome do arquivo |
programa.jpg |
Download
|
| Descrição |
|
| Tamanho |
4 Kbytes
|
| Baixado: |
38 vez(es) |
|
| Nome do arquivo |
NUMERO.jpg |
Download
|
| Descrição |
|
| Tamanho |
5 Kbytes
|
| Baixado: |
40 vez(es) |
|
| Nome do arquivo |
comandos.jpg |
Download
|
| Descrição |
|
| Tamanho |
22 Kbytes
|
| Baixado: |
45 vez(es) |
This message was edited 2 times. Last update was at 12/10/2010 00:44:56
|
Seja educado. Agradeça quem te ajudou. Não custa nada.
Dúvidas de Java? Utilize o fórum! Não respondo via MP.
"Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Fowler)
"A vida é um escândalo, e no final dá sempre errado. O que humaniza o homem é o fracasso."
http://davidbuzatto.com.br | GitHub | uHunt | CV Lattes | Last.fm |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/10/2010 00:40:29
|
davidbuzatto
Moderador
![[Avatar]](/images/avatar/7ba6d33c373fea56b7258003b16c68e5.jpg)
Membro desde: 07/08/2004 23:47:57
Mensagens: 4013
Localização: Vargem Grande do Sul - SP
Offline
|
Segue o lexer e o parser.
Para usar é fácil.
Note que tirei o acento do ô do Move_robô. Com acento não funciona
Coloque o .jar do antlr no classpath do seu projeto e faça algo assim:
Se você melhorar sua gramática (definir as palavras reservadas, etc), a manipulação do resultado do lexer pode ficar mais fácil
Como exercício, vc pode modificar a gramática tbm para ignorar espaços em branco.
[]´s
| Nome do arquivo |
lexer e parser.rar |
Download
|
| Descrição |
|
| Tamanho |
4 Kbytes
|
| Baixado: |
34 vez(es) |
This message was edited 1 time. Last update was at 12/10/2010 00:43:48
|
Seja educado. Agradeça quem te ajudou. Não custa nada.
Dúvidas de Java? Utilize o fórum! Não respondo via MP.
"Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Fowler)
"A vida é um escândalo, e no final dá sempre errado. O que humaniza o homem é o fracasso."
http://davidbuzatto.com.br | GitHub | uHunt | CV Lattes | Last.fm |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/10/2010 01:21:43
|
rock-skull
JavaBaby
![[Avatar]](/images/avatar/fb4c835feb0a65cc39739320d7a51c02.jpg)
Membro desde: 18/02/2005 23:09:24
Mensagens: 79
Localização: Campinas - SP
Offline
|
Nossa! Isso que é ajuda. Brigadão mesmo.
Vou fuçar esses códigos amanhã. Valeu!
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/10/2010 11:18:19
|
davidbuzatto
Moderador
![[Avatar]](/images/avatar/7ba6d33c373fea56b7258003b16c68e5.jpg)
Membro desde: 07/08/2004 23:47:57
Mensagens: 4013
Localização: Vargem Grande do Sul - SP
Offline
|
Olá,
Não resisti, e já escrevi o parser tbm no método main, melhore isso ok?
Fiz várias modificações na gramática tbm.
Gramática:
Parser:
Note que os espaços em branco ainda não são tratados e que eu retirei o sinal de + dos números por dois motivos: primeiro, a convenção para números positivos é não usar sinal; segundo, se você tentar dar um parseInt em um "+2" vai ocorrer uma NumberFormatException.
Veja que em cada lugar que coloquei um System.out.printf ou println é o lugar onde o comando já foi analizado e os parâmetros já estão carregados, bastando você mandar o robô executar o comando.
Outra coisa. Usei o ANTLR Works para editar a gramática e para gerar o código Java do lexer e do parser.
Como "tarefa" você pode então modificar a gramática para aceitar espaços em branco e ainda melhorar ela ainda mais.
Uma observação importante: as regras léxicas são tratadas como terminais na gramática e devem SEMPRE iniciar com letra maiúscula. As regras sintáticas representam os não terminais e suas respectivas regras de produção. Note que nessas produções você pode usar alguns meta-símbolos de expressões regulares (como o * por exemplo), o que não é permitido em uma gramática livre de contexto normal.
Segue em anexo os arquivos gerados, a gramática e os diagramas sintáticos.
P.S. Faltou falar: os erros sintáticos não estão sendo tratados tbm
| Nome do arquivo |
lexer e parser.rar |
Download
|
| Descrição |
|
| Tamanho |
33 Kbytes
|
| Baixado: |
39 vez(es) |
This message was edited 1 time. Last update was at 12/10/2010 11:22:13
|
Seja educado. Agradeça quem te ajudou. Não custa nada.
Dúvidas de Java? Utilize o fórum! Não respondo via MP.
"Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Fowler)
"A vida é um escândalo, e no final dá sempre errado. O que humaniza o homem é o fracasso."
http://davidbuzatto.com.br | GitHub | uHunt | CV Lattes | Last.fm |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/10/2010 10:55:07
|
rock-skull
JavaBaby
![[Avatar]](/images/avatar/fb4c835feb0a65cc39739320d7a51c02.jpg)
Membro desde: 18/02/2005 23:09:24
Mensagens: 79
Localização: Campinas - SP
Offline
|
Nossa, isso já vai ajudar bastante. Obrigado.
Quanto ao sinal, vou manter ele, mas vendo o seu código, é só fazer uma rotinazinha ali no case pra analisar se tem o sinal de mais. É que na hora de programar o robô, esse sinal é importante pra explicitar a direção do movimento da junta. Como o trabalho é um kit didático, acho melhor deixar.
Ok. Verei também essa parte de erros sintáticos. Mas muito obrigado, isso que você mandou já vai ser de grande ajuda.
Quando terminar posto aqui o resultado. Ainda vai demorar um pouco, que ainda tenho que me reunir com o orientador e tomar umas decisões, e a linguagem vai ser um pouco mais complexa que isso, eu coloquei isso como exemplo.
Mais uma vez, obrigado.
|
|
|
 |
|
|