Implementar um shell em c - como fazer o parser?

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?

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

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.>

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.