Skip to content

Jison not assuming correct grammar #394

@8150133

Description

@8150133

I'm creating a grammar in jison

This is my jison file:

sgr.jison

    /*
    AUX VARIABLES
    */
    %{
    var contratos = "(E1:ENTIDADE)-[C:CONTRATO] -> (E2:ENTIDADE)";
    var dataArray = {};
    
    function
    translateQuery(dataArray) 
    {
    	var finalQuery = dataArray["Listar"] + " "
    		 			 + dataArray["Contratos"] + "\n"
    		 			 + dataArray["Onde"] + " "
    					 + dataArray["condition"] + "\n"
    					 + dataArray["Retornar"] + " "
    					 + dataArray["returnAttributes"]
        console.log("\n" + finalQuery)
    }
    
    %}
    
    
    /* description: Parses end executes mathematical expressions. */
    
    /* lexical grammar */
    %lex
    
    %%
    \s+                   	/* skip whitespace */
    Listar				  	return 'MATCH'
    Contratos				return 'CONTRACTS'
    Onde					return 'WHERE'
    Retornar 				return 'RETURN'
    e						return 'AND'
    ou						return 'OR'
    
    ","						return 'DELIMITER'
    ";"						return 'END'
    
    [><>=<==]           	return 'MATH_SYMBOL'
    [0-9]+\b     			return 'VALUE'
    [A-Za-z0-9.]+\b			return 'ENTITY_ATTRIBUTE'
    ["]						return 'QUOTATION_MARK'
    
    
    
    
    
    
    /lex
    
    %start expressions
    
    %% /* language grammar */
    
    expressions :
    	regra				
    		{
    			/*
    			ADD SOMETHING 
    			ONLY IF NEEDED
    			*/
    		}
    	| /* | significa um OU o que quer dizer que isto aqui pode ter mais do que uma regra ISTO E FEITO PELA RECURSIVIDADE*/
    	expressions regra
    		{
    			/*
    			ADD SOMETHING 
    			ONLY IF NEEDED
    			*/
    		}
    ;
    
     regra: 
     	MATCH CONTRACTS
     	WHERE condition
    	RETURN returnAttributes END
    	 	{
    	 		$$ = $1 + " "
    	 			+ $2 + " "
    	 			+ $3 + " "
    	 			+ $4 + " "
    	 			+ $5 + " "
    	 			+ $6 + " "
    	 			dataArray[$1] = "MATCH"
    	 			dataArray[$2] = contratos
    	 			dataArray[$3] = "WHERE"
    	 			dataArray["condition"] = $4
    	 			dataArray[$5] = "RETURN"
    	 			dataArray["returnAttributes"] = $6
    	 			/*ESTA FUNCAO TRATA DE TRADUZIR A QUERY QUE E INTERPRETADA*/
    	 			translateQuery(dataArray)
    	 	}
     ;
    
     condition:
     	ENTITY_ATTRIBUTE MATH_SYMBOL
     		{
     			$$ = $1 +  " "
     				+ $2
     		}
     	|
     	condition VALUE
     		{
     			$$ = $1 +  " "
     				+ $2
     		}
    	|
    	condition QUOTATION_MARK ENTITY_ATTRIBUTE QUOTATION_MARK
    		{
    				$$ = $1 +  " "
     				+ $2 + " "
    				+ $3 + " "
    				+ $4
    		}
    	|
    	condition AND ENTITY_ATTRIBUTE MATH_SYMBOL VALUE
    		{
    			$$ = $1 +  " "
     				+ $2 + " "
    				+ $3 + " "
    				+ $4 + " "
    				+ $5
    		}
    	|
    	condition OR ENTITY_ATTRIBUTE MATH_SYMBOL VALUE
    		{
    			$$ = $1 +  " "
     				+ $2 + " "
    				+ $3 + " "
    				+ $4 + " "
    				+ $5
    		}
    	|
    	condition AND ENTITY_ATTRIBUTE MATH_SYMBOL QUOTATION_MARK ENTITY_ATTRIBUTE QUOTATION_MARK
    		{
    			$$ = $1 +  " "
     				+ $2 + " "
    				+ $3 + " "
    				+ $4 + " "
    				+ $5 + " "
    				+ $6 + " "
    				+ $7
    		}
    	|
    	condition OR ENTITY_ATTRIBUTE MATH_SYMBOL QUOTATION_MARK ENTITY_ATTRIBUTE QUOTATION_MARK
    		{
    			$$ = $1 +  " "
     				+ $2 + " "
    				+ $3 + " "
    				+ $4 + " "
    				+ $5 + " "
    				+ $6 + " "
    				+ $7
    		}
     ;
    
     returnAttributes:
     	ENTITY_ATTRIBUTE
     		{
     			$$ = $1
     		}
     	|
     	returnAttributes DELIMITER ENTITY_ATTRIBUTE
     		{
     			$$ = $1 + ""
     				+ $2 + " "
     				+ $3
     		}
     ;

In my lexical grammar definition i have:

e      return 'AND'
ou    return 'OR'

so, whenever in my testfile "e" or "ou" were found they should return "AND" and "OR" respectively.

The problem is, when i test it, instead of returning me "AND" and "OR" it is returning me "e" and "ou".

Take a look:

This is my testfile:

test.sgr

Listar Contratos
 Onde C.preco=1000
 Retornar C.Preco, C.NifAdjudicante,C.NifAdjudicataria;
 
 
 Listar Contratos
 Onde C.preco=1000 e E1.name="ESTG"
 Retornar C.Preco, C.NifAdjudicante,C.NifAdjudicataria;
 
 
 Listar Contratos
 Onde C.preco=1000 e E1.name="ESTG" e C.TipoProcedimento="ADS"
 Retornar C.Preco, C.NifAdjudicante,C.NifAdjudicataria;
 
 
 Listar Contratos
 Onde E1.name="ESTG"
 Retornar E1.name,C.Preco,C.NifAdjudicante,C.NifAdjudicataria;
 
 
 Listar Contratos
 Onde E1.name="ESTG" e C.preco=1000 ou C.preco>1000 
 Retornar E1.name,C.Preco,C.NifAdjudicante,C.NifAdjudicataria;

The outputs should be:

MATCH (E1:ENTIDADE)-[C:CONTRATO] -> (E2:ENTIDADE)
    WHERE C.preco = 1000
    RETURN C.Preco, C.NifAdjudicante, C.NifAdjudicataria
    
    MATCH (E1:ENTIDADE)-[C:CONTRATO] -> (E2:ENTIDADE)
    WHERE C.preco = 1000 AND E1.name = " ESTG "
    RETURN C.Preco, C.NifAdjudicante, C.NifAdjudicataria
    
    MATCH (E1:ENTIDADE)-[C:CONTRATO] -> (E2:ENTIDADE)
    WHERE C.preco = 1000 AND E1.name = " ESTG " AND C.TipoProcedimento = " ADS "
    RETURN C.Preco, C.NifAdjudicante, C.NifAdjudicataria
    
    MATCH (E1:ENTIDADE)-[C:CONTRATO] -> (E2:ENTIDADE)
    WHERE E1.name = " ESTG "
    RETURN E1.name, C.Preco, C.NifAdjudicante, C.NifAdjudicataria
    
    MATCH (E1:ENTIDADE)-[C:CONTRATO] -> (E2:ENTIDADE)
    WHERE E1.name = " ESTG " AND C.preco = 1000 OR C.preco > 1000
    RETURN E1.name, C.Preco, C.NifAdjudicante, C.NifAdjudicataria

However the outputs are:

outputs

What i've done wrong?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions