|
View:
New views
4 Messages
—
Rating Filter:
Alert me
|
|
|
Compiller cannot deside between function and assigmentHi, 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 assigmentSergej 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 assigmentSorry the input would be
a=5; print(a);
|
|
|
Re: Compiller cannot deside between function and assigmentSergej 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@... |
| Free Forum Powered by Nabble | Forum Help |