Descri¸c˜
ao Formal da Linguagem LM
Leandro Motta Barros
Dezembro de 02001
1
Descri¸
c˜
ao da Linguagem LM
LM ´e uma linguagem de programa¸c˜ao funcional. LM n˜ao ´e ML. LM significa “Leandro Motta”, em homenagem a seu criador. Ou “L´ıngua Morta”, j´a que todas as palavras reservadas s˜ao derivadas do Latim [1] [2].
A seguir ´e apresentada a gram´atica de LM, juntamente com informa¸c˜oes sobre a semˆantica da linguagem.
1.1 Elementos B´asicos
A defini¸c˜ao de d´ıgito n˜ao apresenta nenhuma surpresa. Na defini¸c˜ao de letra, apenas conv´em notar que o s´ımbolo underscore ( ) ´e considerado uma letra. hD´ıgitoi → 0 .. . hD´ıgitoi → 9 hLetrai → a .. . hLetrai → z hLetrai → A .. . hLetrai → Z hLetrai →
A partir destas defini¸c˜oes ´e poss´ıvel especificar um inteiro literal e um iden-tificador. Um inteiro literal ´e simplesmente uma seq¨uˆencia de um ou mais d´ıgitos:
hInteiro Literali → hD´ıgitoi
hInteiro Literali → hD´ıgitoi hInteiro Literali
Um identificador ´e uma seq¨uencia de uma ou mais letras e d´ıgitos que deve come¸car por uma letra.
hIdentificadori → hLetrai
hIdentificadori → hIdentificadori hLetrai hIdentificadori → hIdentificadori hNumeroi
A linguagem LM considera que espa¸cos (representados por “ ”), tabula¸c˜oes (tabs) e quebras de linha (eols) s˜ao equivalentes.
hEspa¸coi → hEspa¸coi → eol hEspa¸coi → tab
hEspa¸cosi → hEspa¸coi hEspa¸cos Opc.i hEspa¸cos Opc.i → ε
hEspa¸cos Opc.i → hEspa¸coi hEspa¸cos Opc.i
Express˜oes inteiras s˜ao express˜oes LM que, quando avaliadas, resultam em um n´umero inteiro. Uma express˜ao inteira pode ser um inteiro literal, um identificador, ou uma chamada de fun¸c˜ao.
hExpress˜ao Inteirai → hInteiro Literali hExpress˜ao Inteirai → hIdentificadori
hExpress˜ao Inteirai → hChamada de Fun¸c˜aoi
1.2 Fun¸c˜oes
A seguir s˜ao apresentadas regras referentes a fun¸c˜oes. Fun¸c˜oes em LM podem ou n˜ao receber parˆametros.
1.2.1 Defini¸c˜ao de fun¸c˜oes
Uma fun¸c˜ao LM ´e definida atrav´es da palavra reservada definire. O corpo de uma fun¸c˜ao ´e composto de exatamente uma chamada de fun¸c˜ao. S´o seria ´
util permitir mais de uma chamada se elas pudessem causar efeitos colate-rais (como atribui¸c˜oes). Mas este n˜ao ´e o caso, pois LM ´e uma linguagem funcional.
hDefini¸c˜ao de Fun¸c˜aoi → definire hEspa¸cosi hIdentificadori hEspa¸cos Opc.i ( hEspa¸cos Opc.i hParˆametros Formaisi
hEspa¸cos Opc.i ) hEspa¸cos Opc.i hChamada de Fun¸c˜aoi
hParˆametros Formaisi → ε
hParˆametros Formaisi → hParˆametros Formais0i hParˆametros Formais0i → hIdentificadori
hParˆametros Formais0i → hIdentificadori hEspa¸cos Opc.i , hEspa¸cos Opc.i hParˆametros Formais0i
1.2.2 Chamadas de fun¸c˜ao
Chamadas de fun¸c˜oes definidas pelo usu´ario s˜ao feitas conforme as regras mostradas a seguir. Regras para chamadas de fun¸c˜oes pr´e-definidas s˜ao dis-cutidas na se¸c˜ao 1.2.3.
hChamada de Fun¸c˜aoi → hIdentificadori hEspa¸cos Opc.i ( hEspa¸cos Opc.i hParˆametros Reaisi hEspa¸cos Opc.i )
hParˆametros Reaisi → ε
hParˆametros Reaisi → hParˆametros Reais0i hParˆametros Reais0i → hExpress˜ao Inteirai
hParˆametros Reais0i → hExpress˜ao Inteirai hEspa¸cos Opc.i , hEspa¸cos Opc.i hParˆametros Reais0i
´
E interessante notar que as fun¸c˜oes definidas pelo usu´ario podem receber ou-tras fun¸c˜oes definidas pelo usu´ario como parˆametro, poishExpress˜ao Inteirai pode ser transformada em um identificador. Isto ´e sintaticamente correto, apesar de que uma fun¸c˜ao n˜ao ´e realmente uma express˜ao inteira.
1.2.3 Fun¸c˜oes pr´e-definidas
LM possui um conjunto de fun¸c˜oes pr´e-definidas (FPDs) que s˜ao discutidas nas pr´oximas se¸c˜oes. Chamadas a fun¸c˜oes pr´e-definidas podem ser divididas em grupos de acordo com o n´umero de parˆametros que recebem.
hChamada FPD 1 i → hNome FPD 1 i hEspa¸cos Opc.i ( hEspa¸cos Opc.i hExpress˜ao Inteirai hEspa¸cos Opc.i )
hChamada FPD 2 i → hNome FPD 2 i hEspa¸cos Opc.i ( hEspa¸cos Opc.i hExpress˜ao Inteirai hEspa¸cos Opc.i , hEspa¸cos Opc.i hExpress˜ao Inteirai hEspa¸cos Opc.i )
hChamada FPD 2+i → hNome FPD 2+i hEspa¸cos Opc.i ( hEspa¸cos Opc.i hExpress˜ao Inteirai hEspa¸cos Opc.i ,
hEspa¸cos Opc.i hParˆametros Reais0i hEspa¸cos Opc.i )
hChamada FPD 3 i → hNome FPD 3 i hEspa¸cos Opc.i ( hEspa¸cos Opc.i hExpress˜ao Inteirai hEspa¸cos Opc.i , hEspa¸cos Opc.i hExpress˜ao Inteirai hEspa¸cos Opc.i , hEspa¸cos Opc.i hExpress˜ao Inteirai hEspa¸cos Opc.i )
As chamadas de fun¸c˜oes pr´e-definidas n˜ao s˜ao amb´ıguas: a regra a ser apli-cada pode ser facilmente deduzida a partir do nome da fun¸c˜ao, que ´e o primeiro s´ımbolo que aparece no lado direito de todas as regras deste grupo. Evidentemente, chamadas de fun¸c˜oes pr´e-definidas tamb´em s˜ao chamadas de fun¸c˜ao:
hChamada de Fun¸c˜aoi → hChamada FPD 1 i hChamada de Fun¸c˜aoi → hChamada FPD 2 i hChamada de Fun¸c˜aoi → hChamada FPD 2+i hChamada de Fun¸c˜aoi → hChamada FPD 3 i
1.3 Aritm´etica de Inteiros
LM possui cinco fun¸c˜oes pr´e-definidas que possibilitam a execu¸c˜ao das ope-ra¸c˜oes aritm´eticas b´asicas com n´umeros inteiros. Os parˆametros destas fun-¸
c˜oes devem ser express˜oes inteiras.
As fun¸c˜oes adicere e multiplicare recebem como parˆametros dois ou mais valores e retornam, respectivamente, a soma e o produto dos parˆametros. hNome FPD 2+i → adicere
hNome FPD 2+i → multiplicare
As outras fun¸c˜oes para aritm´etica de inteiros admitem apenas dois parˆ a-metros. deducere realiza a opera¸c˜ao de subtra¸c˜ao; didere efetua a divis˜ao inteira; e relicus ´e usada para obter o resto da divis˜ao inteira.
hNome FPD 2 i → deducere hNome FPD 2 i → didere
hNome FPD 2 i → relicus
1.4 Compara¸c˜oes
V´arias fun¸c˜oes de LM permitem realizar compara¸c˜oes: superus (maior que), intra (menor que), aequalis (igual), alius (diferente), superusaequalis (igual ou maior que) e intraaequalis (igual ou menor que)1.
hNome FPD 2 i → superus hNome FPD 2 i → intra hNome FPD 2 i → aequalis hNome FPD 2 i → alius hNome FPD 2 i → superusaequalis hNome FPD 2 i → intraaequalis
Todas estas fun¸c˜oes admitem dois parˆametros, que devem ser express˜oes inteiras. A chamada de fun¸c˜ao “superus (a, b)” retorna 1 se a > b e 0 caso contr´ario. As outras fun¸c˜oes seguem o mesmo padr˜ao.
1.5 Opera¸c˜oes L´ogicas
Em LM o n´umero zero ´e a ´unica express˜ao considerada falsa. Qualquer outra express˜ao ´e considerada verdadeira.
Trˆes opera¸c˜oes l´ogicas s˜ao suportadas por LM. A opera¸c˜ao l´ogica e ´e reali-zada pela fun¸c˜ao et. A opera¸c˜ao ou ´e feita pela fun¸c˜ao vel. E a opera¸c˜ao n˜ao´e efetuada pela fun¸c˜ao nec.
et e vel admitem dois ou mais parˆametros e sua semˆantica ´e a esperada: et retorna 1 caso todos os seus parˆametros sejam verdadeiros (diferentes de zero) e 0 caso contr´ario; vel retorna 0 se todos os seus parˆametros fo-rem falsos (iguais a zero) e 1 caso contr´ario. A avalia¸c˜ao dos parˆametros ´e “curto-circuitada”, ou seja, eles s˜ao avaliados apenas at´e o ponto em que seja poss´ıvel obter o valor de retorno da fun¸c˜ao.
hNome FPD 2+i → et hNome FPD 2+i → vel
Apenas um parˆametro pode (e deve) ser passado para a fun¸c˜ao nec. Se o
1
Segundo [1], em Latim existe uma palavra, dumtaxat, que pode ter dois significados totalmente contr´arios: “n˜ao maior que” ou “n˜ao menor que”. N˜ao imagino como algu´em possa formar uma frase com um termo desses. . .
parˆametro for verdadeiro, nec retorna 0; se for falso, retorna 1. hNome FPD 1 i → nec
1.6 Testes Condicionais
Testes condicionais podem ser feitos atrav´es da fun¸c˜ao pr´e-definida si, que deve receber trˆes express˜oes inteiras como parˆametros.
hNome FPD 3 i → si
A semˆantica da fun¸c˜ao si ´e a seguinte: se a avalia¸c˜ao do primeiro parˆ ame-tro resultar em um valor diferente de zero (verdadeiro), ent˜ao o segundo parˆametro ´e avaliado e seu valor retornado. Sen˜ao, o terceiro parˆametro ´e avaliado e seu valor retornado.
1.7 Programa
Finalmente, um programa LM ´e uma seq¨uˆencia de uma ou mais defini¸c˜oes de fun¸c˜oes possivelmente separadas por espa¸cos. A execu¸c˜ao de um programa consiste na avalia¸c˜ao da ´ultima fun¸c˜ao definida.
hProgramai → hEspa¸cos Opc.i hDefini¸c˜ao de Fun¸c˜aoi hEspa¸cos Opc.i hProgramai → hEspa¸cos Opc.i hDefini¸c˜ao de Fun¸c˜aoi hProgramai
2
Altera¸
c˜
oes na Gram´
atica
Esta se¸c˜ao apresenta altera¸c˜oes em algumas regras da gram´atica, que buscam torn´a-la adequada para a transforma¸c˜ao em um parser. As regras que n˜ao apresentam problemas n˜ao s˜ao mencionadas.
2.1 Inteiros Literais
As regras que definem inteiros literais podem ser fatoradas: hInteiro Literali → hD´ıgitoi hInteiro Literal0i
hInteiro Literal0i → ε
2.2 Identificadores
Originalmente as regras que definiam identificadores possu´ıam recurs˜ao `a esquerda. Ela foi eliminada, dando origem `as seguintes regras:
hIdentificadori → hLetrai hIdentificador0i hIdentificador0i → ε
hIdentificador0i → hLetrai hIdentificador0i hIdentificador0i → hNumeroi hIdentificador0i
2.3 Parˆametros
As regras que definem listas de parˆametros (formais e reais) podem ser fatoradas. Para parˆametros formais temos:
hParˆametros Formaisi → ε
hParˆametros Formaisi → hParˆametros Formais0i
hParˆametros Formais0i → hIdentificadori hParˆametros Formais00i hParˆametros Formais00i → ε
hParˆametros Formais00i → hEspa¸cos Opc.i , hEspa¸cos Opc.i hParˆametros Formais0i
E, similarmente, para parˆametros reais: hParˆametros Reaisi → ε
hParˆametros Reaisi → hParˆametros Reais0i
hParˆametros Reais0i → hExpress˜ao Inteirai hParˆametros Reais00i
hParˆametros Reais00i → ε
hParˆametros Reais00i → hEspa¸cos Opc.i , hEspa¸cos Opc.i hParˆametros Reais0i
2.4 Express˜oes Inteiras
H´a um problema com as regras apresentadas para express˜oes inteiras: se o primeiro s´ımbolo da express˜ao inteira for uma letra, ser´a imposs´ıvel descobrir se o que est´a sendo lido ´e um identificador ou uma chamada de fun¸c˜ao definida pelo usu´ario. Para corrigir este problema as regras que definem
uma express˜ao inteira foram substitu´ıdas. hExpress˜ao Inteirai → hInteiro Literali hExpress˜ao Inteirai → hChamada FPD 1 i hExpress˜ao Inteirai → hChamada FPD 2 i hExpress˜ao Inteirai → hChamada FPD 2+i hExpress˜ao Inteirai → hChamada FPD 3 i
Estas regras s˜ao suficientes para o caso de o primeiro s´ımbolo lido ser um d´ıgito ou o nome de uma fun¸c˜ao pr´e-definida. Mas, como o primeiro s´ımbolo lido pode ser uma letra (ou seja, o in´ıcio de um identificador), novas regras s˜ao necess´arias:
hExpress˜ao Inteirai → hIdentificadori hExpress˜ao Inteira0i hExpress˜ao Inteira0i → ε
hExpress˜ao Inteira0i → hEspa¸cos Opc.i ( hEspa¸cos Opc.i
hParˆametros Reaisi hEspa¸cos Opc.i )
2.5 Programa
´
E poss´ıvel fatorar as regras que definem um programa:
hProgramai → hEspa¸cos Opc.i hDefini¸c˜ao de Fun¸c˜aoi hPrograma0i hPrograma0i → hEspa¸cos Opc.i
hPrograma0i → hProgramai
Referˆ
encias
[1] English to Latin. http://cawley.archives.nd.edu/cgi-bin/ lookdown.pl.
[2] Latin Word List. http://kufacts.cc.ukans.edu/ftp/pub/history/ Europe/Medieval/aids/latwords.html.