• Nenhum resultado encontrado

Defini¸c˜oes para o Analisador L´exico

4.4 A Linguagem de Especifica¸c˜ao do Front-End

4.4.2 Defini¸c˜oes para o Analisador L´exico

A defini¸c˜ao para o analisador l´exico come¸ca com a palavra-chave %%Lexer, seguida de regras que podem ser sinˆonimos, condi¸c˜oes e padr˜oes, como mostra a seguinte sintaxe:

Lexer_Def ::= "%%Lexer" Lexer_Rules

Lexer_Rules ::= {Synonymous} [Conditions] [Patterns]

Sinˆonimos: d˜ao nomes `as express˜oes regulares, conforme ilustrado na Figura 4.3.

digito [0-9]

/

/Nome //Express˜ao regular

Figura 4.3: Sinˆonimos

A partir dessa declara¸c˜ao, pode-se usar o nome digito entre chaves no lugar de [0-9]. A sintaxe dos sinˆonimos ´e a seguinte:

Synonymous ::= Name Regular_Expression {Regular_Expression} Name ::= Identifier

Regular_Expression ::= String

| "[" {Letter | Digit | Symbol} "]" | "." | Regular_Expression "*" | Regular_Expression "+" | Regular_Expression "?" | Regular_Expression "{"number ( [","] | ["," number] )"}" | "{" Name "}" | "\0" | "\123" | "\x2a" | "(" Regular_Expression ")" | Regular_Expression "|" Regular_Expression | Regular_Expression "/" Regular_Expression | "^" Regular_Expression | Regular_Expression "$" | "<" Name ">" Regular_Expression | "<" "*" ">" Regular_Expression | "<<" "EOF" ">>"

As express˜oes usadas no FrEG obedecem `as mesmas regras e conven¸c˜oes das express˜oes usadas no Lex ou Flex, portanto mais detalhes sobre as ex- press˜oes regulares podem ser encontrados em [49, 46].

Padr˜oes: os padr˜oes s˜ao usados para definir os tokens e suas a¸c˜oes semˆanticas. A Figura 4.4 mostra o exemplo de um padr˜ao.

“while” -> While ;

/

/Token //A¸c˜ao semˆantica

Figura 4.4: Padr˜oes

Os tokens s˜ao definidos via express˜oes regulares. As a¸c˜oes semˆanticas aparecem `a direita da defini¸c˜ao do token. Existem cinco tipos de a¸c˜oes semˆanticas:

• Ignora o token, por exemplo: [ \n\t] ;

O exemplo define que os espa¸cos sejam ignorados.

• Define o token com um erro l´exico. Por exemplo: . -> ERROR;

O exemplo define que qualquer caractere com exce¸c˜ao do \n, defini¸c˜ao dada pelo “.”, seja um erro l´exico.

"while" -> While; "*" -> mult;

[A-Za-z](_|[A-Za-z]|[0-9])* -> Identificador;

O FrEG determina que o nome a direita da “->” ´e o nome do terminal que aparecer´a nas regras gramaticais.

No exemplo a palavra-chave “while”´e representada na gram´atica pelo terminal While, o s´ımbolo “*”´e representado pelo terminal mult e os tokens que come¸cam com uma letra seguido por nenhum ou v´arios un- derscores, letras ou d´ıgitos s˜ao representado pelo terminal Identificador. • Ativa ou desativa uma condi¸c˜ao. Por exemplo:

"/*" -> BEGIN(comentarios); <comentarios>"*/" -> END();

No exemplo, ´e definido que, ao ser encontrado o /*, ´e ativada a condi¸c˜ao comentarios, que permanece ativa at´e que seja encontrada o */. A condi¸c˜ao ´e ativada pelo comando BEGIN e desativada pelo comando END. Uma condi¸c˜ao tamb´em pode ser desativada quando outra condi¸c˜ao ´e ativada.

• Adiciona o contador de linhas do c´odigo fonte. Por exemplo:

[\n] -> endline;

O exemplo define que, ao ser encontrado o \n, o contador de linhas do c´odigo fonte ´e adicionado. O n´umero de linhas do c´odigo fonte ´e usado nas mensagens de erros l´exicos e sint´aticos e tamb´em pode ser usado pelo usu´ario nas mensagens de erros semˆanticos.

As trˆes ´ultimas a¸c˜oes mostradas podem estar presentes na mesma de- fini¸c˜ao de um token. Elas devem ser separadas por v´ırgulas e se o nome do terminal estiver presente, deve ser a ´ultima a¸c˜ao declarada.

A sintaxe dos Padr˜oes ´e a seguinte:

Patterns ::= "%Pattern" Pattern {Pattern} Pattern ::= Token_Def [Action] ";"

Token_Def ::= Regular_Expression {Regular_Expression} Action ::= "->" Begin_End_Conditons ["," EndLine]

["," Name_Token_AST]

| "->" EndLine ["," Begin_End_Conditons] ["," Name_Token_AST]

| "->" Name_Token_AST | "->" Error Begin_End_Conditons ::= "BEGIN" "(" Name ")"

| "END" "(" ")" EndLine ::= "endline" Error ::= "ERROR" Name_Token_AST ::= Token_Type Token_Type ::= Terminal

Condi¸c˜oes: ´e o mecanismo condicional para a forma¸c˜ao de tokens. Qual- quer padr˜ao que comece com <c> somente ser´a formado se a condi¸c˜ao de nome c estiver ativa. Por exemplo:

<comentarios>[^\n]* ; <comentarios>"\n" -> endline;

Se a condi¸c˜ao comentarios estiver ativa, o primeiro padr˜ao ignora todos os caracteres com a exce¸c˜ao do \n e o segundo padr˜ao ao encontrar ao \n adiciona o contador de linhas do c´odigo fonte.

A declara¸c˜ao das condi¸c˜oes come¸ca com a palavra-chave %inclusive ou %exclusive seguido por uma lista de nomes, por exemplo:

%inclusive comentarios string %exclusive caracter

Se a condi¸c˜ao ´e do tipo %inclusive, ent˜ao as regras sem condi¸c˜ao e as regras com uma determinada condi¸c˜ao ativa podem ser usadas. Se a condi¸c˜ao ´e do tipo %exclusive, somente as regras com uma determinada condi¸c˜ao ativa podem ser usadas. A sintaxe das condi¸c˜oes ´e mostrada a seguir:

Conditions ::= "%Conditions" Conditions_list Conditions_list ::= Conditions_mode {Conditions_mode}

Conditions_mode ::= ("%inclusive" | "%exclusive") Name {Name}

A Figura 4.5 mostra parte da defini¸c˜ao do analisador l´exico para a lingua- gem Small. A defini¸c˜ao completa ´e descrita no Apˆendice B desta disserta¸c˜ao. Para todos os terminais definidos, o FrEG gera a declara¸c˜ao de uma classe de um nodo da AST correspondente ao terminal. A classe ´e gerada com o mesmo nome do terminal, possuindo como membro apenas uma string que possui o valor do token. Para recuperar esse valor deve-se utilizar o m´etodo da classe chamado de getToken value(). Todas as classes deste tipo s˜ao sub- classes da classe Token. A classe Token ´e gerada pelo ACOA independente da especifica¸c˜ao feita pelo usu´ario, sendo usada apenas para agrupar em uma hierarquia diferente as classes que representam um terminal.

Vale ressaltar que essas classes em nenhum momento s˜ao instanciadas pelo analisador l´exico. Sua instancia¸c˜ao acontece no analisador sint´atico caso o

%%Lexer

letra [A-Za-z] digito [0-9] numero {digito}+

identificador {letra} (_ | {letras}{digito})* %Conditions %inclusive comentarios %Pattern "/*" -> BEGIN(comentarios); <comentarios>"*/" -> END(); <comentarios>[^*\n]* ; "program" -> program; "var" -> Var; "proc" -> Proc; "func" -> Func; ":=" -> OAtr; "*" -> mult; "/" -> divi; {numero} -> ConstanteInt;

Figura 4.5: Parte da defini¸c˜ao l´exica de Small

usu´ario tenha especificado que um terminal fa¸ca parte de um nodo da AST que representa uma produ¸c˜ao gramatical, como ser´a visto na Se¸c˜ao 4.4.3.

Para ilustrar a gera¸c˜ao das classes, considere por exemplo os padr˜oes da Figura 4.6, cuja classes s˜ao apresentadas na Figura 4.7.

"if" -> If; "then" -> Then; "else" -> Else; {numero} -> ConstanteInt; {id} -> Identificador; Figura 4.6: Padr˜oes

Documentos relacionados