[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 5/9] java: example: properly track the locations
From: |
Akim Demaille |
Subject: |
[PATCH 5/9] java: example: properly track the locations |
Date: |
Sun, 2 Feb 2020 15:26:23 +0100 |
This example, so far, was tracking the current token number, not the
current column number. This is not nice for an example...
* examples/java/Calc.y (PositionReader): New.
Use it.
* examples/java/Calc.test: Check the output.
---
examples/java/Calc.test | 2 +-
examples/java/Calc.y | 78 ++++++++++++++++++++++++++++++-----------
2 files changed, 59 insertions(+), 21 deletions(-)
diff --git a/examples/java/Calc.test b/examples/java/Calc.test
index 996b20e0..b0d238f1 100644
--- a/examples/java/Calc.test
+++ b/examples/java/Calc.test
@@ -30,4 +30,4 @@ run 0 '7
cat >input <<EOF
1 + 2 * * 3
EOF
-run 0 "err: 1.5: syntax error, unexpected '*', expecting number or '-' or '('
or '!'"
+run 0 "err: 1.8-1.9: syntax error, unexpected '*', expecting number or '-' or
'(' or '!'"
diff --git a/examples/java/Calc.y b/examples/java/Calc.y
index a0ac5694..94411898 100644
--- a/examples/java/Calc.y
+++ b/examples/java/Calc.y
@@ -9,11 +9,13 @@
%locations
%code imports {
+ import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StreamTokenizer;
+ import java.nio.CharBuffer;
}
%code {
@@ -76,26 +78,26 @@ exp:
class CalcLexer implements Calc.Lexer {
StreamTokenizer st;
+ PositionReader reader;
public CalcLexer (InputStream is)
{
- st = new StreamTokenizer (new InputStreamReader (is));
+ reader = new PositionReader (new InputStreamReader (is));
+ st = new StreamTokenizer (reader);
st.resetSyntax ();
st.eolIsSignificant (true);
- st.whitespaceChars ('\t', '\t');
- st.whitespaceChars (' ', ' ');
st.wordChars ('0', '9');
}
-
- Position yypos = new Position (1, 0);
+ Position start = new Position (1, 0);
+ Position end = new Position (1, 0);
public Position getStartPos () {
- return yypos;
+ return start;
}
public Position getEndPos () {
- return yypos;
+ return end;
}
public void yyerror (Calc.Location l, String s)
@@ -106,7 +108,6 @@ class CalcLexer implements Calc.Lexer {
System.err.println (l + ": " + s);
}
-
Integer yylval;
public Object getLVal () {
@@ -114,13 +115,15 @@ class CalcLexer implements Calc.Lexer {
}
public int yylex () throws IOException {
+ start.set (end);
int ttype = st.nextToken ();
- yypos = new Position (yypos.lineno (), yypos.token () + 1);
+ end.set (reader.getPosition ());
if (ttype == st.TT_EOF)
return EOF;
else if (ttype == st.TT_EOL)
{
- yypos = new Position (yypos.lineno () + 1, 0);
+ end.line += 1;
+ end.column = 0;
return (int) '\n';
}
else if (ttype == st.TT_WORD)
@@ -128,6 +131,8 @@ class CalcLexer implements Calc.Lexer {
yylval = new Integer (st.sval);
return NUM;
}
+ else if (st.ttype == ' ' || st.ttype == '\t')
+ return yylex ();
else
return st.ttype;
}
@@ -135,38 +140,71 @@ class CalcLexer implements Calc.Lexer {
class Position {
- public int line;
- public int token;
+ public int line = 1;
+ public int column = 0;
public Position ()
{
- line = 0;
- token = 0;
+ line = 1;
+ column = 0;
}
public Position (int l, int t)
{
line = l;
- token = t;
+ column = t;
}
+ public void set (Position p)
+ {
+ line = p.line;
+ column = p.column;
+ }
+
public boolean equals (Position l)
{
- return l.line == line && l.token == token;
+ return l.line == line && l.column == column;
}
public String toString ()
{
- return Integer.toString (line) + "." + Integer.toString(token);
+ return Integer.toString (line) + "." + Integer.toString(column);
}
- public int lineno ()
+ public int line ()
{
return line;
}
- public int token ()
+ public int column ()
{
- return token;
+ return column;
+ }
+}
+
+class PositionReader extends BufferedReader {
+
+ private Position position = new Position ();
+
+ public PositionReader (Reader reader) {
+ super(reader);
+ }
+
+ public int read () throws IOException {
+ int res = super.read ();
+ if (res > -1) {
+ char c = (char)res;
+ if (c == '\r' || c == '\n') {
+ position.line += 1;
+ position.column = 1;
+ } else {
+ position.column += 1;
+ }
+ }
+ return res;
+ }
+
+ public Position getPosition () {
+ return position;
}
}
--
2.25.0
- [PATCH 0/9] Prepare Java for parse.error custom|detailed, Akim Demaille, 2020/02/02
- [PATCH 2/9] tests: comment changes, Akim Demaille, 2020/02/02
- [PATCH 4/9] java: example: improve, Akim Demaille, 2020/02/02
- [PATCH 1/9] skeletons: add support for %code epilogue, Akim Demaille, 2020/02/02
- [PATCH 3/9] java: example: rely on autoboxing, Akim Demaille, 2020/02/02
- [PATCH 5/9] java: example: properly track the locations,
Akim Demaille <=
- [PATCH 7/9] java: formatting changes, Akim Demaille, 2020/02/02
- [PATCH 8/9] java: add access to the number of errors, Akim Demaille, 2020/02/02
- [PATCH 6/9] java: avoid trailing white spaces, Akim Demaille, 2020/02/02
- [PATCH 9/9] java: use the same calc tests as the other skeletons, Akim Demaille, 2020/02/02