Defining string java cup/jflex

L

lionelv

Maybe someone here can help with this.

I'm a newbie to cup/jflex and I'm having some troubles. I'm starting
with an example I found somewhere and modifying it slowly to get the
desired result. I want to allow strings, eventually between braces
{aString} but for now I've been trying between quotes as the examples
do it this way. In the following "comment" is a keyword:

4+8;
comment "aString";

Here is the code that I have modified:

Scanner.jflex

*************************************
package Example;

import java_cup.runtime.SymbolFactory;
%%
%cup
%class Scanner
%{
public Scanner(java.io.InputStream r, SymbolFactory sf){
this(r);
this.sf=sf;
}
StringBuffer string = new StringBuffer();
private SymbolFactory sf;
%}
%eofval{
return sf.newSymbol("EOF",sym.EOF);
%eofval}

%state STRING

%%
";" { return sf.newSymbol("Semicolon",sym.SEMI); }
"+" { return sf.newSymbol("Plus",sym.PLUS); }
"*" { return sf.newSymbol("Times",sym.TIMES); }
"(" { return sf.newSymbol("Left Bracket",sym.LPAREN); }
")" { return sf.newSymbol("Right Bracket",sym.RPAREN); }
[0-9]+ { return sf.newSymbol("Integral Number",sym.NUMBER, new
Integer(yytext())); }
[ \t\r\n\f] { /* ignore white space. */ }
.. { System.err.println("Illegal character: "+yytext()); }

\" { string.setLength(0); yybegin(STRING); }

<YYINITIAL> "comment" { return sf.newSymbol("Comment", sym.COMMENT); }

<STRING> {
\" { yybegin(YYINITIAL);
return symbol(sym.STRING_LITERAL,
string.toString()); }
[^\n\r\"\\]+ { string.append( yytext() ); }
\\t { string.append('\t'); }
\\n { string.append('\n'); }

\\r { string.append('\r'); }
\\\" { string.append('\"'); }
\\ { string.append('\\'); }
}

*************************************

Parser.cup

*************************************
package Example;

import java_cup.runtime.*;

parser code {:
public static void main(String args[]) throws Exception {
SymbolFactory sf = new ComplexSymbolFactory();
if (args.length==0) new Parser(new
Scanner(System.in,sf),sf).parse();
else new Parser(new Scanner(new
java.io.FileInputStream(args[0]),sf),sf).parse();
}
:}

terminal COMMENT;
terminal String STRING;
terminal SEMI, PLUS, TIMES, LPAREN, RPAREN;
terminal Integer NUMBER;

non terminal expr_list, expr_part, type_data;
non terminal Integer expr;

precedence left PLUS;
precedence left TIMES;

expr_list ::= expr_list expr_part | expr_part | expr_list type_data;
expr_part ::= expr:e {: System.out.println(" = "+e+";"); :} SEMI;
expr ::= NUMBER:n
{: RESULT=n; :}
| expr:l PLUS expr:r
{: RESULT=new Integer(l.intValue() + r.intValue()); :}
| expr:l TIMES expr:r
{: RESULT=new Integer(l.intValue() * r.intValue()); :}
| LPAREN expr:e RPAREN
{: RESULT=e; :}
;
type_data ::= COMMENT {: System.out.println("bar"); :} STRING:str {:
System.out.println(str); :} SEMI;

*************************************

The above code once I run it on the lines a gave gives a syntax error
and complains about illegal characters " a S t r i n g and "

What am I doing wrong and where should I start learning about this?

thanks

Lionel.
 
O

Oliver Wong

Maybe someone here can help with this.

I'm a newbie to cup/jflex and I'm having some troubles. I'm starting
with an example I found somewhere and modifying it slowly to get the
desired result. I want to allow strings, eventually between braces
{aString} but for now I've been trying between quotes as the examples
do it this way. [code snipped]

The above code once I run it on the lines a gave gives a syntax error
and complains about illegal characters " a S t r i n g and "

What am I doing wrong and where should I start learning about this?

Is your goal to learn cup/jflex, or is it to write your own parser? If
it's the latter, I recommend you use a different parser generator, since
from the lack of response, it sounds like most people don't know cup/jflex's
syntax. Try ANTLR, for example. They have a very active mailing list and so
someone will probably answer your questions.

If it's the former... well... good luck.

- Oliver
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,054
Latest member
TrimKetoBoost

Latest Threads

Top