Bien primero vamos a definir la gramática, será una estructura sencilla ya que únicamente reconocerá la declaración de variables dentro de una función.
Un ejemplo de la entrada para la gramática puede ser el siguiente.
Function Ejemplo(){
Integer entero;
String cad1, cad2;
Float decimal;
}
Luego de ello vamos a generar el archivo para programar en Delphi, lo hacemos seleccionando la opción Delphi – Alexandre Rai Engine (With Separate Procedure).
Esto generara el archivo .pas que genera Gold Parser, para continuar con este ejemplo es necesario aclarar que se debe contar con archivos de configuración interna tales como GOLDParser, Token, Reduction, Rule, Symbol, GOLDParserCMP. Estos archivos serán necesarios para realizar el parseo, los mismos pueden ser descargados de la página de Gold Parser.
Luego de contar con dicho archivos, se explicara la estructura del archivo generado.
La rutina que se encarga de iniciar el parseo sera Parser.Execute, aquí se debe especificar el CGT generado por Gold Parser.
procedure Parser.Execute(aSource : String);
A continuación veremos los bloques de código que conforman esta rutina.
En esta parte se especifican las variables que serán utilizan para el desarrollo del análisis.
var
lParser : TGOLDParser;
lResponse : Integer;
lDone : Boolean;
zToken : Integer;
lError : String;
Se crea la estructura del parser.
begin
lParser := TGOLDParser.Create;
En el siguiente bloque se debe especificar el CGT y en base a ello se pasa como parámetro la cadena o archivo de entrada.
if lParser.LoadCompiledGrammar(ExtractFilePath(Application.ExeName)+'Parser.cgt')
then begin
lParser.OpenTextString(aSource);
Se colocan las reducciones a TRUE.
lParser.TrimReductions := TRUE;
lDone := False;
En esta parte de código se verificaran los errores que puedan presentarse en el archivo de entrada, especificando para ello la línea y columna en donde fue encontrado el error.
En este primer bloque se verificara si el error es de tipo léxico.
while not lDone do begin
lResponse := lParser.Parse;
case lResponse of gpMsgLexicalError: begin
if Assigned(FOnError) then
FOnError('Line ' + IntToStr(lParser.CurrentLineNumber) + ': Lexical Error: Cannot recognize token: ' + lParser.CurrentToken.DataVar);
lDone := True;
end;
En este Segundo bloque se verificara si el error es de tipo sintáctico.
gpMsgSyntaxError: begin
if Assigned(FOnError) then
begin
lError := '';
for zToken := 0 to lParser.TokenTable.Count - 1 do
lError := lError + ' ' + Parser.TokenTable[zToken].Name;
FOnError('Line ' + IntToStr(lParser.CurrentLineNumber) + ': Syntax Error: Expecting the following tokens: ' + Trim(lError));
end;
lDone := True;
end;
En este bloque se empezaran a colocar aquellas operaciones necesarias para generar la salida que se requiere.
gpMsgReduction:
begin
ReplaceReduction(lParser);
if lParser.CurrentReduction <> nil then
lParser.CurrentReduction.Tag := Parser.CurrentLineNumber;
lParser.CurrentReduction.Tag := Parser.CurrentLineNumber;
end;
gpMsgAccept: begin
Aquí deben ser colocadas las acciones.
probe tu ejemplo y me da errores con "ID" podrias eviarmelo para ver como corre!!
ResponderEliminar