com/questions/113578/o-que-%C3%A9-analise-l%C3%A9xica/114050
Wallace Maxters
26,6mil429124
6 Respostas
ativas mais antigas votos
votar a
favor
16
votar Anlise lxica o processo realizado sobre um texto, digamos um programa de computador ou ento um
contra este em lexemes e os converte para uma sequncia de tokens, os quais so usados para alimentar um
aceitos geralmente chamado de lexer, scanner ou tokenizer.
+100
Definio
tokens / lexemes
Lexemes so unidades sintticas relevantes do contexto do lexer, por exemplo para um lexer voltado a um
poderiam ser: 1, "ol", for, ==, variableName, function.
Um token uma estrutura que categoriza um lexeme, ele contm um nome abstrato que representa o gru
no seja nico. Exemplo de alguns tokens (o token representado no formato < token, valor-opcional> e
<
<
<
<
<
<
Lexers e parsers esto intimamente ligados contudo so conceitos distintos. O lexer especializado em e
em estruturas com "significado", no caso os tokens. J o parser tem a funo de analisar a estrutura sint
determinada linguagem de programao a expresso "ol" 1 == "outroliteral" sintaticame
as estruturas produzidas pelo lexer so o que parser usa como fonte para realizar o parsing, ou seja, o pa
impede de construir um parser que faa a anlise sinttica em cima de texto puro, contudo a separao d
um lexer na prtica
A teoria essencial, contudo nada melhor que cdigo real para ajudar na compreenso. Aqui eu mostro u
subconjunto de CSS, mais especificamente ele lida com este exemplo:
h1 {
color: red;
font-size: 30px;
}
body {
background-color: yellow;
}
div {
margin: 10px;
padding: 10px;
}
O cdigo pode ser executado e ir mostrar a lista de tokens gerados aps processar nosso CSS alvo:
// nosso CSS
var css = "h1 { \n\
color: red; \n\
font-size: 30px; \n\
} \n\
\n\
body { \n\
background-color: yellow; \n\
} \n\
\n\
div { \n\
margin: 10px; \n\
padding: 10px; \n\
} \n\
";
/**
* Lista que define nossos tokens e as respectivas expresses regulares que os encon
*/
var TOKENS = [
{name: 'EMPTY', regex: /^(\s+)/ },
{name: 'RULE_SET_START', regex: /^({)/ },
{name: 'RULE_SET_END', regex: /^(})/ },
{name: 'RULE_DEFINITION', regex: /^(:)/ },
{name: 'RULE_END', regex: /^(;)/ },
{name: 'SELECTOR', regex: /^([a-zA-Z]+[a-zA-Z0-9]*)(?=\s*{)/ },
{name: 'RULE', regex: /^([a-z][-a-z]+)(?=\s*:)/ },
{name: 'RULE_VALUE', regex: /^(\w+)(?=\s*(;|}))/ }
];
/**
* Iteramos sobre toda a lista de TOKENS at encontrarmos algum cujo padro
* Quando ocorre um "match" ns adicionamos o lexeme com seu respectivo tok
* Caso nenhum padro bata com o texto uma exceo lanada imprimindo a l
*
*/
for (var i=0; i<TOKENS.length; i++) {
var obj = TOKENS[i];
var tokenName = obj.name;
var tokenRegex = obj.regex;
var matched = text.match(tokenRegex);
if (!matched) {
continue;
}
hasMatch = true;
var lexeme = matched[1];
// removemos do texto o lexeme encontrado
// para que outro possa ser considerados
// na prxima iterao
text = text.substring(lexeme.length);
break;
if (!hasMatch) {
throw 'Invalid pattern at:\n' + (text.substring(0, text.indexOf('\n
break;
}
outputTokenList.forEach(function(token) {
document.write('< ' + token[0]);
if (token.length > 1) {
document.write(' , ' + token[1]);
}
document.write(' ><br>');
});
Expand snippet
compartilharmelhorar esta
resposta
editada 22/02
s 16:47
respondida 20/02
s 2:01
BrunoRB
3.142217
Gostei! (+1) e
vou roubar o teu
exemplo na
minha resposta :)
JJoao 25/02 s
22:49
comentar
Rodrigo Guiotti
1.841116
votar a
favor 8
votar
contra
Estou atualizando minha resposta por acreditar que ela no foi ampla o suficiente e
tambm por achar que as outras respostas apresentadas ou foram genricas demais ou
atrelaram muito lexers a parsers.
Primeiro as semelhanas fundamentais entre lexers e parsers:
1. Ambos tem como entrada smbolos de algum alfabeto. Geralmente os smbolos
de um lexer so caracteres ASCII ou Unicode enquanto que parsers processam
tokens (smbolos terminais da gramtica que esto validando).
2. Eles analisam esses smbolos associando-os a uma gramtica pra reconhec-los
como membros de uma linguagem. Conforme expliquei acima, lexers validam
apenas linguagens regulares enquanto que parsers operam em linguagens livres
de contexto. Nveis 3 e 2 na hierarquia de Chomsky, respectivamente.
3. Ambos produzem como sada sentenas da linguagem que esto avaliando.
Lexers distinguem tokens de uma sequncia de caracteres dada como entrada,
Roney Gomes
36616
comentar
Um interpretador/compilador no entende "texto grosso" diretamente, ele precisa dos
dados bem organizados e definidos.
Por exemplo, vamos supor que nosso interpretador precise interpretar essa simples
soma:
42 + 42
E agora? Bom, vamos analisar o que acontece quando ele analisa a entrada, sendo o
ponto final o caractere que ele est analisando:
1) . 42 (Nosso analisador contm o nmero 4 no buffer, ele sabe que pela definio, um
nmero 1 dgito seguido de mais dgitos.)
2) 4 . 2 (At agora, ele possui 4 como nmero e continua, armazenando 2 no buffer.)
3) 42 . ( o fim do nmero, nosso interpretador retorna NUMBER. Encontramos um
espao em branco, que pela definio, no retorna nada.)
Por enquanto, sabemos isso:
<NUMBER, 42> . + 42
O analisador est sobre o '+', ele sabe que pela definio um PLUS:
<NUMBER, 42> <PLUS, '+'> . 42
A anlise foi concluda, e agora? Nosso interpretador pode interpretar esses dados de
forma consistente. Vamos supor que nosso interpretador use uma gramtica bem
simples e restritiva para somas:
sum -> NUMBER PLUS NUMBER
Ele pode utilizar os tokens de sada do analisador lxico e se focar somente no parsing.
Como a sada consiste de NUMBER PLUS NUMBER, se enquadra como uma soma
vlida.
respondida 24/02 s 17:02
compartilharmelhorar esta resposta editada 24/02 s 17:09
dxhj
516213
comentar
As respostas apresentadas so muito boas, e j abordaram toda a parte tcnica do
assunto. Portanto, apenas complementando a informao, segue uma explicao
focada apenas na etimologia das palavras.
votar a favor 4
votar contra
Anlise Lxica
Refere-se ao vocabulrio da linguagem (palavras). De uma forma simples, uma
Anlise Sinttica
Refere-se as regras gramaticais da linguagem, ou seja, trata-se de como podemos
organizar os termos da linguagem para criar um sentido. Pode encarar como a forma
em que um comando deve ser estruturado para executar uma ao, ou as regras para
a formao de uma frase.
Exemplo tcnico aqui.
Anlise Semntica
Aqui estamos falando do sentido/significado empregado na frase/comando. Por
exemplo, podemos utilizar a frase Me inclui fora dessa, onde as palavras e
a sintaxe esto corretas mas semanticamente no.
Exemplo tcnico aqui.
editada 23/02 s
19:18
respondida 22/02 s
17:45
Bruno Oliveira
1407
comentar
votar a J se disse tudo; no entanto eu gosto de processadores de linguagens, e no resisto a pr aqui um exempl
favor
4
Enunciado: dado uma CSS (simplificada, vou tomar como exemplo o caso apresentado por @BrunoRP)
votar
:
| css bloco
;
bloco: ID '{' props '}'
;
props:
| props prop
;
prop : ID ':' v ';'
v
: ID | STR | MEA
%%
#include "lex.yy.c"
// bloco*
{ printf("%s - %d\n",$1,$3);}
{ $$ = 0
;}
{ $$ = $1+1 ;}
// prop*
// contar as prop
;
;
// propriedade
// valor
{
{
[{}:;]
} // ignorar espaos
} // ignorar comentrios
[a-zA-Z][-a-zA-Z0-9]* { yylval.s=strdup(yytext);
\"[^\"]*\"
{ yylval.s=strdup(yytext);
[0-9]+(px|pt|mm)
{ yylval.s=strdup(yytext);
.
return ID; }
return STR; }
return MEA; }
%%
Compilando e testando:
$
$
$
$
flex proc.l
yacc proc.y
cc -o proc y.tab.c
proc < ex.css
##ex.css o exemplo de css do @BrunoRP
h1 - 2
body - 1
div - 2