public inbox for frysk-cvs@sourceware.org
help / color / mirror / Atom feed
* [SCM]  master: Communicate details on fully qualified identifier to parser
@ 2008-05-28 15:22 pmachata
  0 siblings, 0 replies; only message in thread
From: pmachata @ 2008-05-28 15:22 UTC (permalink / raw)
  To: frysk-cvs

The branch, master has been updated
       via  7391aeb00d8f701dbfb30f026ec050cda6731f3c (commit)
      from  9c76bab74da6115985f57ad5383fb7415eb0be25 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email.

- Log -----------------------------------------------------------------
commit 7391aeb00d8f701dbfb30f026ec050cda6731f3c
Author: Petr Machata <pmachata@redhat.com>
Date:   Wed May 28 17:04:05 2008 +0200

    Communicate details on fully qualified identifier to parser
    
    * IDENT and IDENT_TAB rules now pass up FqIdentToken tokens, with detailed
      info on components of identifier (symbol name, dso, etc.)

-----------------------------------------------------------------------

Summary of changes:
 frysk-core/frysk/expr/CExpr.g                      |   81 ++++++++++----------
 frysk-core/frysk/expr/ChangeLog                    |    6 ++
 ...eIdentifierException.java => FqIdentToken.java} |   42 +++++------
 .../frysk/expr/IncompleteIdentifierException.java  |    2 +-
 4 files changed, 68 insertions(+), 63 deletions(-)
 copy frysk-core/frysk/expr/{IncompleteIdentifierException.java => FqIdentToken.java} (74%)

First 500 lines of diff:
diff --git a/frysk-core/frysk/expr/CExpr.g b/frysk-core/frysk/expr/CExpr.g
index 98cfdba..816e8d5 100644
--- a/frysk-core/frysk/expr/CExpr.g
+++ b/frysk-core/frysk/expr/CExpr.g
@@ -423,12 +423,14 @@ tokens
 
 {
     private String fqinit;
+
     private char fqLA(int i) throws CharStreamException {
         if (i >= fqinit.length())
             return LA(i - fqinit.length() + 1);
         else
             return fqinit.charAt(i);
     }
+
     private void fqmatch(String s) throws MismatchedCharException, CharStreamException {
         while (fqinit.length() > 0) {
             char c = s.charAt(0);
@@ -503,22 +505,16 @@ ELLIPSIS  : "..." ;
  * or EOF stops the lookahead.
  */
 
-private
+protected
 PARSE_FQIDENT
     : {
-            // Automaton state is composed of following sub-states:
-            final int FILE = 1;
-            final int LINE = 2;
-            final int SYMB = 4;
-            int state = LINE | SYMB;
-
             String matched = "";
             String part = "";
 
-            String dso = null;
-            String file = null;
-            String proc = null;
-            String line = null;
+            String partDso = null;
+            String partFile = null;
+            String partProc = null;
+            String partLine = null;
 
             int i = 0;
             char c;
@@ -539,10 +535,15 @@ PARSE_FQIDENT
                 if (part.length() == 0)
                     throw new RecognitionException("Empty DSO part `" + matched
                                                    + "' in fully qualified notation.");
-                dso = part;
+                partDso = part;
                 part = "";
             }
 
+            // Automaton state is composed of following sub-states:
+            final int FILE = 1;
+            final int LINE = 2;
+            final int SYMB = 4;
+            int state = LINE | SYMB;
             loop: while(true) {
                 c = fqLA(i++);
                 if (Character.isWhitespace(c) || c == EOF_CHAR)
@@ -558,15 +559,15 @@ PARSE_FQIDENT
                     }
 
                     case '#': {
-                        if (line == null && proc == null) {
-                            if ((state & FILE) != 0 && file == null)
-                                file = part.substring(0, part.length() - 1);
+                        if (partLine == null && partProc == null) {
+                            if ((state & FILE) != 0 && partFile == null)
+                                partFile = part.substring(0, part.length() - 1);
                             else if ((state & LINE) != 0)
-                                line = part.substring(0, part.length() - 1);
+                                partLine = part.substring(0, part.length() - 1);
                             else if ((state & SYMB) != 0) {
-                                proc = part.substring(0, part.length() - 1);
-                                if (!Character.isJavaIdentifierStart(proc.charAt(0)))
-                                    throw new RecognitionException("Procedure part (`" + proc + "') in fully "
+                                partProc = part.substring(0, part.length() - 1);
+                                if (!Character.isJavaIdentifierStart(partProc.charAt(0)))
+                                    throw new RecognitionException("Procedure part (`" + partProc + "') in fully "
                                                                    + "qualified notation has to be valid identifier.");
                             } else
                                 // This # could belong to the next symbol.
@@ -576,7 +577,7 @@ PARSE_FQIDENT
                             throw new RecognitionException("Unexpected `#' after line or proc name was defined.");
 
                         state = SYMB;
-                        if (line == null && proc == null)
+                        if (partLine == null && partProc == null)
                             state |= LINE;
                         part = "";
                         break;
@@ -588,11 +589,12 @@ PARSE_FQIDENT
 
                             if (!(Character.isJavaIdentifierStart(c)
                                   || c == '@'
-                                  || (c == ':' && part.equals("plt:")))) {
+                                  || (c == ':' && part.length() == 4
+                                      && part.equals("plt:")))) {
 
                                 // Break out early if we are already
                                 // just waiting for symbol.
-                                if (line != null || proc != null)
+                                if (partLine != null || partProc != null)
                                     break loop;
                                 else
                                     state &= ~SYMB;
@@ -629,7 +631,6 @@ PARSE_FQIDENT
             // parts before yelling at user that his identifier sucks.
             Matcher m = Pattern.compile("[a-zA-Z0-9_$]*").matcher(part);
             if (m.lookingAt()) {
-                // XXX This accepts also e.g. "plt:something" (i.e. without the "#" part). Ok?
                 int diff = part.length() - m.end();
                 if (diff > 0) {
                     matched = matched.substring(0, matched.length() - diff);
@@ -640,26 +641,25 @@ PARSE_FQIDENT
             if (!Character.isJavaIdentifierStart(part.charAt(0)))
                 throw new RecognitionException("Invalid symbol `" + part + "'.");
 
-            if (false) {
-            if (dso != null)
-                System.err.println("DSO:  " + dso);
-            if (file != null)
-                System.err.println("File: " + file);
-            if (line != null)
-                System.err.println("Line: " + line);
-            if (proc != null)
-                System.err.println("Proc: " + proc);
-            System.err.println("Symb: " + (wantPlt ? "plt:" : "")
-                               + part + (version != null ? "@" + version : ""));
-            }
+            FqIdentToken tok = new FqIdentToken(IDENT, matched);
+            tok.dso = partDso;
+            tok.file = partFile;
+            tok.line = partLine;
+            tok.proc = partProc;
+            tok.symbol = part;
+            tok.version = version;
+            tok.wantPlt = wantPlt;
+            tok.setLine(getLine());
+            $setToken(tok);
 
             fqmatch(matched);
-            //System.out.println("matched = " + matched);
+            tok.setColumn(getColumn() - matched.length());
         } ;
 
 protected
 IDENT
-    : ('$'|'#'|'a'..'z'|'A'..'Z'|'_') { fqinit = $getText; } PARSE_FQIDENT ;
+    : ('$'|'#'|'a'..'z'|'A'..'Z'|'_') { fqinit = $getText; }
+      fqident:PARSE_FQIDENT { $setToken(fqident); } ;
 
 /**
  *  A <TAB> token is returned not only on regular tabs
@@ -668,7 +668,10 @@ IDENT
 
 IDENT_TAB 
     :   '\t'
-    |   IDENT {$setType(IDENT);} ('\t' {$setType(IDENT_TAB);})? 
+    |   ident:IDENT { $setType(IDENT); $setToken(ident); }
+        ('\t' { $setType(IDENT_TAB);
+                ident.setText($getText);
+                ident.setType(IDENT_TAB); })?
     ;
 
 protected
@@ -807,7 +810,7 @@ NUM
 			)?
 		|	(('1'..'9') ('0'..'9')* {_ttype = DECIMALINT;})
              ( '#' {fqinit = $getText;}
-               PARSE_FQIDENT { $setType(IDENT); } )?
+               fqident:PARSE_FQIDENT { $setType(IDENT); $setToken(fqident); } )?
 		)
 		(	('l'|'L') { _ttype = DECIMALINT; }
 
diff --git a/frysk-core/frysk/expr/ChangeLog b/frysk-core/frysk/expr/ChangeLog
index 6e97358..a2d954a 100644
--- a/frysk-core/frysk/expr/ChangeLog
+++ b/frysk-core/frysk/expr/ChangeLog
@@ -1,3 +1,9 @@
+2008-05-28  Petr Machata  <pmachata@redhat.com>
+
+	* FqIdentToken.java: New file.
+	* CExpr.g: Use custom token to communicate fully qualified
+	identifier info to parser (or whomever is asking).
+
 2008-05-26  Petr Machata  <pmachata@redhat.com>
 
 	* CExpr.g: Implement #-syntax parser.
diff --git a/frysk-core/frysk/expr/IncompleteIdentifierException.java b/frysk-core/frysk/expr/FqIdentToken.java
similarity index 74%
copy from frysk-core/frysk/expr/IncompleteIdentifierException.java
copy to frysk-core/frysk/expr/FqIdentToken.java
index fa8ad68..72d81e3 100644
--- a/frysk-core/frysk/expr/IncompleteIdentifierException.java
+++ b/frysk-core/frysk/expr/FqIdentToken.java
@@ -1,6 +1,6 @@
 // This file is part of the program FRYSK.
 //
-// Copyright 2007, Red Hat Inc.
+// Copyright 2005, 2007, 2008 Red Hat Inc.
 //
 // FRYSK is free software; you can redistribute it and/or modify it
 // under the terms of the GNU General Public License as published by
@@ -39,29 +39,25 @@
 
 package frysk.expr;
 
-import antlr.collections.AST;
-import java.util.List;
+public class FqIdentToken
+    extends antlr.CommonToken
+{
+    public String dso = null, file = null, line = null,
+		  proc = null, symbol = null, version = null;
+    boolean wantPlt = false;
 
-/** 
- * An incomplete identifier; e.g.: foo<tab>
- */
-class IncompleteIdentifierException extends CompletionException {
-    static final long serialVersionUID = 1;
-    IncompleteIdentifierException(AST identifier) {
-	super(identifier);
+    public FqIdentToken(int t, String txt) {
+	super (t, txt);
     }
-    public String getMessage() {
-	return ("complete identifier <<"
-		+ getText()
-		+ ">> at "
-		+ getColumn()
-		);
-    }
-    int complete(ExprSymTab symTab, List candidates) {
-	symTab.complete(getText(), candidates);
-	if (candidates.size() == 0)
-	    return -1;
-	else
-	    return getColumn();
+
+    public String toString() {
+        return "[" + super.toString()
+	    + (dso != null ? ", dso:" + dso : "")
+	    + (file != null ? ", file:" + file : "")
+	    + (line != null ? ", line:" + line : "")
+	    + (proc != null ? ", proc:" + proc : "")
+	    + (wantPlt ? ", pltref" : "")
+	    + (symbol != null ? ", symbol:" + symbol : "")
+	    + (version != null ? ", version:" + symbol : "") + "]";
     }
 }
diff --git a/frysk-core/frysk/expr/IncompleteIdentifierException.java b/frysk-core/frysk/expr/IncompleteIdentifierException.java
index fa8ad68..30afa28 100644
--- a/frysk-core/frysk/expr/IncompleteIdentifierException.java
+++ b/frysk-core/frysk/expr/IncompleteIdentifierException.java
@@ -43,7 +43,7 @@ import antlr.collections.AST;
 import java.util.List;
 
 /** 
- * An incomplete identifier; e.g.: foo<tab>
+ * An incomplete identifier; e.g.: foo&lt;tab&gt;
  */
 class IncompleteIdentifierException extends CompletionException {
     static final long serialVersionUID = 1;


hooks/post-receive
--
frysk system monitor/debugger


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2008-05-28 15:22 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-05-28 15:22 [SCM] master: Communicate details on fully qualified identifier to parser pmachata

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).