Compiller cannot deside between function and assigment

View: New views
4 Messages — Rating Filter:   Alert me  

Compiller cannot deside between function and assigment

by Sergej :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Hi, first of all, sorry for pasting whole code, but I'm so new to javacc that I even don't know how to isolate the problem.

The problem is that expression() doesn't identify functions. Compiller thinks that this is start of expression.

/**
 * Kalkuliatoriaus sintaksės parseris
 */

PARSER_BEGIN(JavaAlpha)
import java.util.*;
import java.io.*;
import java.lang.*;

public class JavaAlpha {
  static Hashtable<String, Object> localVariables = new Hashtable<String, Object>();
   
  public static void main(String args[]) throws ParseException {
    // Sukuriam naują parserį, kuris skaito iš
    JavaAlpha parser = new JavaAlpha(System.in);
    System.out.println("Waiting for input.");

    while (true) {
//      try {
        // Nuskaitom po vieną eilutę iš klaviatūros
        JavaAlpha.parseStream();
//      } catch (Exception e) {
//        System.out.println(e.getMessage());
//        JavaAlpha.ReInit(System.in);
//      } catch (Error e) {
//        System.out.println(e.getMessage());
//        break;
//      }
    }
  }
 
  public static void assignVariable(String name, Object value)
  {
    localVariables.put(name, value);
  }
 
  public static Object getVariableValue(String name)
  {
    return localVariables.get(name);
  }
}
PARSER_END(JavaAlpha)

TOKEN_MGR_DECLS :
{
}


/* Praleidžiamos žymės */
SKIP : { " " | "\r" | "\t" | "\n" }

TOKEN : /* Simboliai */
{
        < PLUS:       "+" >
| < MINUS:      "-" >
| < MULTIPLY:   "*" >
| < DIVIDE:     "/" >
|   < BRKT_OPEN:  "(" >
|   < BRKT_CLOSE: ")" >
|   < #LETTER:    ["a"-"z"] >
|   < #DIGIT:     ["0"-"9"] >
}


TOKEN : /* Konstantos ir kintamieji */
{
        < NUMBER:     (<DIGIT>)+ >
| < IDENTIFIER:   <LETTER>(<LETTER>|<DIGIT>)* >
}

void parseStream() : {}
{
  line() ";"
}

void line() : { Token t; Object value; String variableName; }
{
  expression()
}

/**
 * Eilutės taisyklė.
 *
 * Kiekviena eilutė turi baigtis kabliataškiu (";")
 */
void assignment() : { Token t; Object value; String variableName; }
{
  t = <IDENTIFIER> { variableName = t.image; }
  "="
  value = expression() { assignVariable(variableName, value); }
}

Object expression() : { double dValue; Token t;}
{
  dValue = element() { return dValue; }
| (
    <IDENTIFIER>
    <BRKT_OPEN>
    t = <IDENTIFIER> { System.out.print(getVariableValue(t.image)); return true; }
    <BRKT_CLOSE>
  )
}

/**
 * Sudėties ir atimties taisyklės
 */
double sum() : { Token t; double value; double result; boolean add; }
{
  value = term() { result = value; }
  (
    (
      t = <PLUS> { add = true; }
      | t = <MINUS> { add = false; }
    )
    value = term() { result = add ? result + value : result - value; }
  )*
  { return result; }
}

/**
 * Daugybos ir dalybos taisyklės
 */
double term() : { Token t; double value; double result; boolean mul; }
{
  value = unary() { result = value; }
  (
    (
      t = <MULTIPLY> { mul = true; }
      | t = <DIVIDE> { mul = false; }
    )
    value = unary() { result = mul ? result + value : result - value; }
  )*
  { return result; }
}

/**
 * Unariniai operatoriai (-x)
 */
double unary() : { double value; }
{
<MINUS> value = element() { return -value; }
  | value = element() { return value; }
}

/**
 * Konstanta
 *
 * Programa gali interpretuoti ne tik skaičius, bet ir išraiškas tarp skliaustelių
 */
double element() : { Token t; double value; }
{
  t = <NUMBER> { return Integer.parseInt(t.image); }
  | (
    <BRKT_OPEN>
    value = sum() { return value; }
    <BRKT_CLOSE>
  )
}

Re: Compiller cannot deside between function and assigment

by Jonathan Revusky-3 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Sergej wrote:
> Hi, first of all, sorry for pasting whole code, but I'm so new to javacc that
> I even don't know how to isolate the problem.
>
> The problem is that expression() doesn't identify functions. Compiller
> thinks that this is start of expression.

I think, at the very least, you really have to provide at least one
example of the input that you want to parse.

Jonathan Revusky
--
lead developer, FreeMarker project, http://freemarker.org/
KawaDD Parser Generator, http://code.google.com/p/kawadd

>
> /**
>  * Kalkuliatoriaus sintaksės parseris
>  */
>
> PARSER_BEGIN(JavaAlpha)
> import java.util.*;
> import java.io.*;
> import java.lang.*;
>
> public class JavaAlpha {
>   static Hashtable<String, Object> localVariables = new Hashtable<String,
> Object>();
>    
>   public static void main(String args[]) throws ParseException {
>     // Sukuriam naują parserį, kuris skaito iš
>     JavaAlpha parser = new JavaAlpha(System.in);
>     System.out.println("Waiting for input.");
>
>     while (true) {
> //      try {
>         // Nuskaitom po vieną eilutę iš klaviatūros
>         JavaAlpha.parseStream();
> //      } catch (Exception e) {
> //        System.out.println(e.getMessage());
> //        JavaAlpha.ReInit(System.in);
> //      } catch (Error e) {
> //        System.out.println(e.getMessage());
> //        break;
> //      }
>     }
>   }
>  
>   public static void assignVariable(String name, Object value)
>   {
>     localVariables.put(name, value);
>   }
>  
>   public static Object getVariableValue(String name)
>   {
>     return localVariables.get(name);
>   }
> }
> PARSER_END(JavaAlpha)
>
> TOKEN_MGR_DECLS :
> {
> }
>
>
> /* Praleidžiamos žymės */
> SKIP : { " " | "\r" | "\t" | "\n" }
>
> TOKEN : /* Simboliai */
> {
> < PLUS:       "+" >
> | < MINUS:      "-" >
> | < MULTIPLY:   "*" >
> | < DIVIDE:     "/" >
> |   < BRKT_OPEN:  "(" >
> |   < BRKT_CLOSE: ")" >
> |   < #LETTER:    ["a"-"z"] >
> |   < #DIGIT:     ["0"-"9"] >
> }
>
>
> TOKEN : /* Konstantos ir kintamieji */
> {
> < NUMBER:     (<DIGIT>)+ >
> | < IDENTIFIER:   <LETTER>(<LETTER>|<DIGIT>)* >
> }
>
> void parseStream() : {}
> {
>   line() ";"
> }
>
> void line() : { Token t; Object value; String variableName; }
> {
>   expression()
> }
>
> /**
>  * Eilutės taisyklė.
>  *
>  * Kiekviena eilutė turi baigtis kabliataškiu (";")
>  */
> void assignment() : { Token t; Object value; String variableName; }
> {
>   t = <IDENTIFIER> { variableName = t.image; }
>   "="
>   value = expression() { assignVariable(variableName, value); }
> }
>
> Object expression() : { double dValue; Token t;}
> {
>   dValue = element() { return dValue; }
> | (
>     <IDENTIFIER>
>     <BRKT_OPEN>
>     t = <IDENTIFIER> { System.out.print(getVariableValue(t.image)); return
> true; }
>     <BRKT_CLOSE>
>   )
> }
>
> /**
>  * Sudėties ir atimties taisyklės
>  */
> double sum() : { Token t; double value; double result; boolean add; }
> {
>   value = term() { result = value; }
>   (
>     (
>       t = <PLUS> { add = true; }
>       | t = <MINUS> { add = false; }
>     )
>     value = term() { result = add ? result + value : result - value; }
>   )*
>   { return result; }
> }
>
> /**
>  * Daugybos ir dalybos taisyklės
>  */
> double term() : { Token t; double value; double result; boolean mul; }
> {
>   value = unary() { result = value; }
>   (
>     (
>       t = <MULTIPLY> { mul = true; }
>       | t = <DIVIDE> { mul = false; }
>     )
>     value = unary() { result = mul ? result + value : result - value; }
>   )*
>   { return result; }
> }
>
> /**
>  * Unariniai operatoriai (-x)
>  */
> double unary() : { double value; }
> {
> <MINUS> value = element() { return -value; }
>   | value = element() { return value; }
> }
>
> /**
>  * Konstanta
>  *
>  * Programa gali interpretuoti ne tik skaičius, bet ir išraiškas tarp
> skliaustelių
>  */
> double element() : { Token t; double value; }
> {
>   t = <NUMBER> { return Integer.parseInt(t.image); }
>   | (
>     <BRKT_OPEN>
>     value = sum() { return value; }
>     <BRKT_CLOSE>
>   )
> }
>


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@...
For additional commands, e-mail: users-help@...


Re: Compiller cannot deside between function and assigment

by Sergej :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Sorry the input would be

a=5;
print(a);


Jonathan Revusky-3 wrote:
Sergej wrote:
> Hi, first of all, sorry for pasting whole code, but I'm so new to javacc that
> I even don't know how to isolate the problem.
>
> The problem is that expression() doesn't identify functions. Compiller
> thinks that this is start of expression.

I think, at the very least, you really have to provide at least one
example of the input that you want to parse.

Jonathan Revusky
--
lead developer, FreeMarker project, http://freemarker.org/
KawaDD Parser Generator, http://code.google.com/p/kawadd

>
> /**
>  * Kalkuliatoriaus sintaksės parseris
>  */
>
> PARSER_BEGIN(JavaAlpha)
> import java.util.*;
> import java.io.*;
> import java.lang.*;
>
> public class JavaAlpha {
>   static Hashtable<String, Object> localVariables = new Hashtable<String,
> Object>();
>    
>   public static void main(String args[]) throws ParseException {
>     // Sukuriam naują parserį, kuris skaito iš
>     JavaAlpha parser = new JavaAlpha(System.in);
>     System.out.println("Waiting for input.");
>
>     while (true) {
> //      try {
>         // Nuskaitom po vieną eilutę iš klaviatūros
>         JavaAlpha.parseStream();
> //      } catch (Exception e) {
> //        System.out.println(e.getMessage());
> //        JavaAlpha.ReInit(System.in);
> //      } catch (Error e) {
> //        System.out.println(e.getMessage());
> //        break;
> //      }
>     }
>   }
>  
>   public static void assignVariable(String name, Object value)
>   {
>     localVariables.put(name, value);
>   }
>  
>   public static Object getVariableValue(String name)
>   {
>     return localVariables.get(name);
>   }
> }
> PARSER_END(JavaAlpha)
>
> TOKEN_MGR_DECLS :
> {
> }
>
>
> /* Praleidžiamos žymės */
> SKIP : { " " | "\r" | "\t" | "\n" }
>
> TOKEN : /* Simboliai */
> {
> < PLUS:       "+" >
> | < MINUS:      "-" >
> | < MULTIPLY:   "*" >
> | < DIVIDE:     "/" >
> |   < BRKT_OPEN:  "(" >
> |   < BRKT_CLOSE: ")" >
> |   < #LETTER:    ["a"-"z"] >
> |   < #DIGIT:     ["0"-"9"] >
> }
>
>
> TOKEN : /* Konstantos ir kintamieji */
> {
> < NUMBER:     (<DIGIT>)+ >
> | < IDENTIFIER:   <LETTER>(<LETTER>|<DIGIT>)* >
> }
>
> void parseStream() : {}
> {
>   line() ";"
> }
>
> void line() : { Token t; Object value; String variableName; }
> {
>   expression()
> }
>
> /**
>  * Eilutės taisyklė.
>  *
>  * Kiekviena eilutė turi baigtis kabliataškiu (";")
>  */
> void assignment() : { Token t; Object value; String variableName; }
> {
>   t = <IDENTIFIER> { variableName = t.image; }
>   "="
>   value = expression() { assignVariable(variableName, value); }
> }
>
> Object expression() : { double dValue; Token t;}
> {
>   dValue = element() { return dValue; }
> | (
>     <IDENTIFIER>
>     <BRKT_OPEN>
>     t = <IDENTIFIER> { System.out.print(getVariableValue(t.image)); return
> true; }
>     <BRKT_CLOSE>
>   )
> }
>
> /**
>  * Sudėties ir atimties taisyklės
>  */
> double sum() : { Token t; double value; double result; boolean add; }
> {
>   value = term() { result = value; }
>   (
>     (
>       t = <PLUS> { add = true; }
>       | t = <MINUS> { add = false; }
>     )
>     value = term() { result = add ? result + value : result - value; }
>   )*
>   { return result; }
> }
>
> /**
>  * Daugybos ir dalybos taisyklės
>  */
> double term() : { Token t; double value; double result; boolean mul; }
> {
>   value = unary() { result = value; }
>   (
>     (
>       t = <MULTIPLY> { mul = true; }
>       | t = <DIVIDE> { mul = false; }
>     )
>     value = unary() { result = mul ? result + value : result - value; }
>   )*
>   { return result; }
> }
>
> /**
>  * Unariniai operatoriai (-x)
>  */
> double unary() : { double value; }
> {
> <MINUS> value = element() { return -value; }
>   | value = element() { return value; }
> }
>
> /**
>  * Konstanta
>  *
>  * Programa gali interpretuoti ne tik skaičius, bet ir išraiškas tarp
> skliaustelių
>  */
> double element() : { Token t; double value; }
> {
>   t = <NUMBER> { return Integer.parseInt(t.image); }
>   | (
>     <BRKT_OPEN>
>     value = sum() { return value; }
>     <BRKT_CLOSE>
>   )
> }
>


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@javacc.dev.java.net
For additional commands, e-mail: users-help@javacc.dev.java.net

Re: Compiller cannot deside between function and assigment

by Jonathan Revusky-3 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Sergej wrote:
> Sorry the input would be
>
> a=5;
> print(a);

You probably should experiment with using explicit lookahead. Perhaps
something like:

LOOKAHEAD(<IDENTIFIER><EQUALS>)
   assighment()
   |
   expression()



Jonathan Revusky
--
lead developer, FreeMarker project http://freemarker.org/
KawaDD Parser Generator, http://code.google.com/p/kawadd

>
>
>
> Jonathan Revusky-3 wrote:
>> Sergej wrote:
>>> Hi, first of all, sorry for pasting whole code, but I'm so new to javacc
>>> that
>>> I even don't know how to isolate the problem.
>>>
>>> The problem is that expression() doesn't identify functions. Compiller
>>> thinks that this is start of expression.
>> I think, at the very least, you really have to provide at least one
>> example of the input that you want to parse.
>>
>> Jonathan Revusky
>> --
>> lead developer, FreeMarker project, http://freemarker.org/
>> KawaDD Parser Generator, http://code.google.com/p/kawadd
>>
>>> /**
>>>  * Kalkuliatoriaus sintaksės parseris
>>>  */
>>>
>>> PARSER_BEGIN(JavaAlpha)
>>> import java.util.*;
>>> import java.io.*;
>>> import java.lang.*;
>>>
>>> public class JavaAlpha {
>>>   static Hashtable<String, Object> localVariables = new Hashtable<String,
>>> Object>();
>>>    
>>>   public static void main(String args[]) throws ParseException {
>>>     // Sukuriam naują parserį, kuris skaito iš
>>>     JavaAlpha parser = new JavaAlpha(System.in);
>>>     System.out.println("Waiting for input.");
>>>
>>>     while (true) {
>>> //      try {
>>>         // Nuskaitom po vieną eilutę iš klaviatūros
>>>         JavaAlpha.parseStream();
>>> //      } catch (Exception e) {
>>> //        System.out.println(e.getMessage());
>>> //        JavaAlpha.ReInit(System.in);
>>> //      } catch (Error e) {
>>> //        System.out.println(e.getMessage());
>>> //        break;
>>> //      }
>>>     }
>>>   }
>>>  
>>>   public static void assignVariable(String name, Object value)
>>>   {
>>>     localVariables.put(name, value);
>>>   }
>>>  
>>>   public static Object getVariableValue(String name)
>>>   {
>>>     return localVariables.get(name);
>>>   }
>>> }
>>> PARSER_END(JavaAlpha)
>>>
>>> TOKEN_MGR_DECLS :
>>> {
>>> }
>>>
>>>
>>> /* Praleidžiamos žymės */
>>> SKIP : { " " | "\r" | "\t" | "\n" }
>>>
>>> TOKEN : /* Simboliai */
>>> {
>>> < PLUS:       "+" >
>>> | < MINUS:      "-" >
>>> | < MULTIPLY:   "*" >
>>> | < DIVIDE:     "/" >
>>> |   < BRKT_OPEN:  "(" >
>>> |   < BRKT_CLOSE: ")" >
>>> |   < #LETTER:    ["a"-"z"] >
>>> |   < #DIGIT:     ["0"-"9"] >
>>> }
>>>
>>>
>>> TOKEN : /* Konstantos ir kintamieji */
>>> {
>>> < NUMBER:     (<DIGIT>)+ >
>>> | < IDENTIFIER:   <LETTER>(<LETTER>|<DIGIT>)* >
>>> }
>>>
>>> void parseStream() : {}
>>> {
>>>   line() ";"
>>> }
>>>
>>> void line() : { Token t; Object value; String variableName; }
>>> {
>>>   expression()
>>> }
>>>
>>> /**
>>>  * Eilutės taisyklė.
>>>  *
>>>  * Kiekviena eilutė turi baigtis kabliataškiu (";")
>>>  */
>>> void assignment() : { Token t; Object value; String variableName; }
>>> {
>>>   t = <IDENTIFIER> { variableName = t.image; }
>>>   "="
>>>   value = expression() { assignVariable(variableName, value); }
>>> }
>>>
>>> Object expression() : { double dValue; Token t;}
>>> {
>>>   dValue = element() { return dValue; }
>>> | (
>>>     <IDENTIFIER>
>>>     <BRKT_OPEN>
>>>     t = <IDENTIFIER> { System.out.print(getVariableValue(t.image));
>>> return
>>> true; }
>>>     <BRKT_CLOSE>
>>>   )
>>> }
>>>
>>> /**
>>>  * Sudėties ir atimties taisyklės
>>>  */
>>> double sum() : { Token t; double value; double result; boolean add; }
>>> {
>>>   value = term() { result = value; }
>>>   (
>>>     (
>>>       t = <PLUS> { add = true; }
>>>       | t = <MINUS> { add = false; }
>>>     )
>>>     value = term() { result = add ? result + value : result - value; }
>>>   )*
>>>   { return result; }
>>> }
>>>
>>> /**
>>>  * Daugybos ir dalybos taisyklės
>>>  */
>>> double term() : { Token t; double value; double result; boolean mul; }
>>> {
>>>   value = unary() { result = value; }
>>>   (
>>>     (
>>>       t = <MULTIPLY> { mul = true; }
>>>       | t = <DIVIDE> { mul = false; }
>>>     )
>>>     value = unary() { result = mul ? result + value : result - value; }
>>>   )*
>>>   { return result; }
>>> }
>>>
>>> /**
>>>  * Unariniai operatoriai (-x)
>>>  */
>>> double unary() : { double value; }
>>> {
>>> <MINUS> value = element() { return -value; }
>>>   | value = element() { return value; }
>>> }
>>>
>>> /**
>>>  * Konstanta
>>>  *
>>>  * Programa gali interpretuoti ne tik skaičius, bet ir išraiškas tarp
>>> skliaustelių
>>>  */
>>> double element() : { Token t; double value; }
>>> {
>>>   t = <NUMBER> { return Integer.parseInt(t.image); }
>>>   | (
>>>     <BRKT_OPEN>
>>>     value = sum() { return value; }
>>>     <BRKT_CLOSE>
>>>   )
>>> }
>>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe@...
>> For additional commands, e-mail: users-help@...
>>
>>
>>
>


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@...
For additional commands, e-mail: users-help@...

LightInTheBox - Buy quality products at wholesale price!