Este problema é um análisador semântico que faz uso deste analisador léxico para identificar os padrão estabelecidos por essas regex e utiliza essa grámatica e este analisador sintático para definir a ordem sintática e semântica dos tokens.
Para executar o projeto através do terminal, digite o seguinte comando no diretório raiz do projeto:
mvn clean install
Em seguida, acesse a pasta target
e lá deverá conter um arquivo
semantic-analyzer-1.0-SNAPSHOT-jar-with-dependencies.jar
que corresponde ao
executável do projeto.
Para iniciar o jar basta executar o seguinte comando:
java -jar semantic-analyzer-1.0-SNAPSHOT-jar-with-dependencies.jar
Deseja executar o projeto pelo netbeans?
Para executar esse software é necessário clonar esse repositório. Após isso, já no netbeans acesse aos menus: `files` > `open project` > selecione o projeto(no diretório onde foi salvo) > Abra o projeto > "Construa" o mesmo.
Por padrão o este software oculta no arquivo de saída os tokens obtidos pelos
analisador léxico.
Porém é possível inserir a flag -l
como no comando abaixo para indicar que
deseja visualizar os tokens.
Assim como os tokens obtidos pelo analisador léxico com o uso da flag
-l
, o software oculta por padrão os erros e os tokens inesperados obtidos pelo analisador sintático utilizando
respectivamente as flags -s
e -c
.
java -jar syntax-analyzer-1.0-SNAPSHOT-jar-with-dependencies.jar -l -s -c
Este analisador é capaz de ler multiplos arquivos de texto, contanto que respeite as seguintes regras:
- Está em uma pasta chamada
input
que deve está contida no mesmo diretório dojar
; - Todos os arquivos devem ser nomeados com o préfixo
entrada
seguido de um número; - Todos os arquivos serem
.txt
;
⚠️ Vale ressaltar que para uma análise semântica precisa, é necessário ter o mínimo(ou no melhor caso: nenhum) erro sintático ou léxico.
var{
int i = 10, j = 10;
}
procedure start {
print("HELLO WORLD!");
}
Será gerado um conjunto de arquivos de saída, denomidado saidaX.txt, onde X é um valor numérico, referente ao arquivo de entrada que ele representa.
Para facilitar a vida do desenvolvedor, alteramos a gramática para permitir que o analisador sintático compreendesse ou permitisse a análise de assinaturas de função, a qual tem o seguinte estrutura:
<SignatureFunc> ::= <Type> Identifier '('<TypeArgList>')';
<SignatureProce> ::= Identifier '('<TypeArgList>')';
<TypeArgList> ::= <Type> ',' <TypeArgList>`
| <Type>
Graças à essa decisão, não é necessário declarar funções exatamente em cima da procedure start
e evita de causar erros semânticos
por não encontrar uma variável declarada.