From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 20769 invoked by alias); 28 May 2008 15:22:32 -0000 Received: (qmail 20742 invoked by uid 9697); 28 May 2008 15:22:31 -0000 Date: Wed, 28 May 2008 15:22:00 -0000 Message-ID: <20080528152231.20724.qmail@sourceware.org> From: pmachata@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] master: Communicate details on fully qualified identifier to parser X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 9c76bab74da6115985f57ad5383fb7415eb0be25 X-Git-Newrev: 7391aeb00d8f701dbfb30f026ec050cda6731f3c Mailing-List: contact frysk-cvs-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: frysk-cvs-owner@sourceware.org Reply-To: frysk@sourceware.org X-SW-Source: 2008-q2/txt/msg00296.txt.bz2 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 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 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 + + * 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 * 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 - */ -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 + * An incomplete identifier; e.g.: foo<tab> */ class IncompleteIdentifierException extends CompletionException { static final long serialVersionUID = 1; hooks/post-receive -- frysk system monitor/debugger