| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/09/2010 00:06:35
|
rodrigo.bossini
GUJ Master
![[Avatar]](/images/avatar/3b6fe2dc98ceed6e1608e7cfc662ab11.jpg)
Membro desde: 01/07/2008 20:59:17
Mensagens: 1055
Offline
|
Pessoal,
Meu exercício da semana na faculdade é implementar um shell em c.
O exercício é cheio de detalhes chatos, mas as ideias principais já tenho.
Minha dúvida é como interpretar os comandos que o meu shell vai receber?
Por exemplo, vou ter um scanf que vai armazenar o comando todo num char *.
Mas e aí, como eu valido a sintaxe do comando?
Dou um "split" e verifico tudo na unha?
|
http://www.rodrigobossini.com.br/
Meu Twitter:@rodrigobossini Se uma pessoa fala português há 30 anos e ainda não aprendeu, por que é que vou acreditar que ela está programando em alguma linguagem de programação há apenas 10 anos e sabe o que está fazendo? |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/09/2010 10:39:57
|
peczenyj
Moderador
![[Avatar]](/images/avatar/299dc35e747eb77177d9cea10a802da2.jpg)
Membro desde: 26/03/2006 23:25:37
Mensagens: 3191
Localização: Rio de Janeiro
Offline
|
Implementar um parser na unha é TENSO, ainda mais em C, mas vou dar os meus pitacos.
De uma olhada nesse cara:
http://fxr.googlebit.com/source/bin/sh/main.c?v=8-CURRENT
Um processo de parse parte do principio que vc tem uma ou mais formas que vc quer encontrar que combinam uma série de identificadores.
Por exemplo, se vc quer um parser simples, que só execute um comando, vc pode assumir que a primeira string que vc receba é o nome do executavel que vc vai rodar. Depois vc pode pensar em passar argumentos para este executavel, dessa forma vc separa os mesmos por um ou mais caracteres espaço.
Mas vc pode querer separar por TAB, por New-Line, etc. E vc pode querer escapar estes caracteres, no caso de remover um arquivo cujo nome possui espaços em branco, por exemplo. Nesse ponto vc pode usar expressões regulares ou mesmo algo como strtok + alguma combinação de funções.
Porem um shell possui uma sintaxe bem complexa: vc tem if, for, declara variaveis, pode ter algum alias, subfunção, etc. Vc tem variaveis de ambiente que alteram o próprio comportamento do shell e do parser -- como o caso da variavel IFS, por exemplo.
Eu analisaria como um shell simples funciona. De uma olhada no codigo do Busybox que ainda possui shell, grep, awk, sed, etc.
Acredito que vc pode usar alguma lib de parsing onde vc define a gramatica através de uma BNF
http://apoie.org/Shell.htm
This message was edited 2 times. Last update was at 02/09/2010 11:03:36
|
http://pacman.blog.br
'Não importa quanto alguém se dedique à tarefa. Ninguém consegue fazer a água da cascata cair para cima.' |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/09/2010 17:35:35
|
rodrigo.bossini
GUJ Master
![[Avatar]](/images/avatar/3b6fe2dc98ceed6e1608e7cfc662ab11.jpg)
Membro desde: 01/07/2008 20:59:17
Mensagens: 1055
Offline
|
Fui pesquisar na LibC sobre Regular expressions e acabei encontrando algo que nunca tinha ouvido falar: Word Expansion. Acho que é a resposta para minha dúvida, não? Meu medo é estar "apelando" e ter o exercício desconsiderado, afinal, me parece (ainda não olhei a fundo) que esse treco aí vai fazer tudo sozinho.>
This message was edited 1 time. Last update was at 02/09/2010 17:36:08
|
http://www.rodrigobossini.com.br/
Meu Twitter:@rodrigobossini Se uma pessoa fala português há 30 anos e ainda não aprendeu, por que é que vou acreditar que ela está programando em alguma linguagem de programação há apenas 10 anos e sabe o que está fazendo? |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/09/2010 17:50:49
|
peczenyj
Moderador
![[Avatar]](/images/avatar/299dc35e747eb77177d9cea10a802da2.jpg)
Membro desde: 26/03/2006 23:25:37
Mensagens: 3191
Localização: Rio de Janeiro
Offline
|
Então, quando vc faz ls *.c o parser identifica o * e realiza a expansão de acordo com os arquivos terminados em .c presentes no diretorio.
Vc não precisa suportar isto se é para fazer um shell simples, alias um shell simples ja é complicado.
Sem falar que vc tem tilde-expansion, brace-expansion, etc.
|
http://pacman.blog.br
'Não importa quanto alguém se dedique à tarefa. Ninguém consegue fazer a água da cascata cair para cima.' |
|
|
 |
|
|