Laborator 3 - Jison

Jison este un generator de parsere pentru javascript. Acesta are sintaxa similara cu Flex si Yacc.

Instalarea Jison

Instalarea jison se poate face fie local in directorul proiectului folosind

npm install jison

fie global folosind

npm install -g jison

Lexer

npm install -g jison-lex

Exemplu

O să construim cu ajutorul unui lexer, un program simplu care calculează suma mai multor numere.

Pentru început, definim lexerul:

sum.lex
%%
[0-9]+	return 'NUMBER';
'+'	return '+';
' '+	return 'SPACE';
%%

Generăm un fișier js din acesta:

jison-lex sum.lex

Observăm că a apărut un nou fișier numit sum.js.

Acest fișier trebuie modificat astfel:

  • se șterge tot conținutul funcției parseError și se lasă doar throw new Error(str);
  • la sfârșitul fișierului trebuie adăugată următoarea linie exports.nume_fisier = nume_fisier, unde nume_fisier reprezintă numele fișierului anterior, fără extensie; în cazul nostru, sum.

Construim programul de bază. Vom realiza un parser, folosindu-ne de lexerul anterior.

main.lex
var lexer = require("./sum.js").sum;
lexer.setInput("10+12+1");
 
 
function my_sum ()
{
	var sum = 0;
	var i;
 
	for (i = 0; i < tokens.length; i++)
		if (tokens[i][0] == 'NUMBER')
			sum = sum + tokens[i][1];
 
	console.log("Sum = " + sum);
}
 
 
var token;
var tokens = [];
do
{
	token = lexer.lex();
	if (token != 'SPACE' && token != lexer.EOF)
		tokens.push([token, parseInt(lexer.yytext)]);
}
while (token != lexer.EOF);
 
my_sum();
Exercițiu

Construiți un lexer pentru următoarea gramatică:

xml: <ID parameters>xml</ID>
parameters: parameter parameters |;
parameter: ID = "TEXT"
TEXT: '{' ALFANUMERIC '}'

Realizați în js un parser pentru aceasta.

cpl-atm/laboratoare/laborator3.txt · Last modified: 2013/11/01 13:13 by laura.vasilescu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0