From fd973e7db501399f124dcc416fd7f231ff7cd740 Mon Sep 17 00:00:00 2001 From: hvbargen <37015738+hvbargen@users.noreply.github.com> Date: Wed, 24 Feb 2021 09:48:51 +0100 Subject: [PATCH] Basic support for ampersand and backslash characters. At least the parser now accepts these characters and can parse a lot more typical scripts. --- pmd-plsql/etc/grammar/PldocAST.jjt | 59 +++++++++++++++++-- .../plsql/ast/PLSQLParserVisitorAdapter.java | 5 ++ .../lang/plsql/rule/AbstractPLSQLRule.java | 6 ++ 3 files changed, 64 insertions(+), 6 deletions(-) diff --git a/pmd-plsql/etc/grammar/PldocAST.jjt b/pmd-plsql/etc/grammar/PldocAST.jjt index c519e16fed..53da7ca36b 100644 --- a/pmd-plsql/etc/grammar/PldocAST.jjt +++ b/pmd-plsql/etc/grammar/PldocAST.jjt @@ -301,7 +301,7 @@ ASTDDLCommand DDLCommand() : ASTSqlPlusCommand SqlPlusCommand() : { - StringBuilder sb = new StringBuilder() ; + StringBuffer sb = new StringBuffer(); } { ( @@ -337,11 +337,10 @@ ASTSqlPlusCommand SqlPlusCommand() : // Attach Library | "." ) - { sb.append(token.getImage()) ; sb.append(" ...") ; } - Skip2NextTokenOccurrence(EOL) //Tracker Issue 1433480 skip until next EOL Special Token - //[";" | "-"] + { sb.append(token.getImage()) ; sb.append(" ") ; sb.append(Read2NextTokenOccurrence(EOL).getImage()) ; + } ) - { jjtThis.setImage(sb.toString()) ; return jjtThis ; } + { jjtThis.setImage(sb.toString()) ; return jjtThis ; } } /* @@ -1140,6 +1139,28 @@ ASTRead2NextOccurrence Read2NextOccurrence(String target) : { jjtThis.setImage(sb.toString()) ; jjtThis.value = sb.toString(); return jjtThis ;} } +/* + Read Tokens up to but not including the target token. +*/ +ASTRead2NextTokenOccurrence Read2NextTokenOccurrence(int target) : +{ + StringBuilder sb = new StringBuilder(); + Token nextToken = getToken(1); + while (nextToken.kind!=target + && (null == nextToken.specialToken || nextToken.specialToken.kind!=target ) //In case the target is a Special Token + && nextToken.kind!=EOF + ) + { + nextToken = getNextToken(); + sb.append(nextToken.getImage()); + sb.append(' '); + nextToken = getToken(1); + } +} +{ + { jjtThis.setImage(sb.toString()) ; jjtThis.value = sb.toString(); return jjtThis ;} +} + /* Read Tokens up to and including the target String. */ @@ -5077,13 +5098,21 @@ TOKEN : | < #_CHARACTER_WO_ASTERISK: | | "(" | ")" | "+" | "-" | "*" | "/" | "<" | ">" | "=" | "!" | "~" | "^" | ";" | ":" | "." | "@" | "%" | "," | "\"" | "#" - | "$" | "&" | "_" | "|" | "{" | "}" | "?" | "[" | "]" + | "$" | "_" | "|" | "{" | "}" | "?" | "[" | "]" | " " | "\t" > | < #SPECIAL_CHARACTERS: "á" | "Ž" | "™" | "š" | "„" | "”" | "ý" | "²" | "€" | "³" | "µ"> | < #DELIMITER: "+" | "%" | "'" | "\"" | "." | "/" | "(" | ")" | ":" | "," | "*" | "=" | "<" | ">" | "@" | ";" | "-"> | + +| + +| < IDENTIFIER: ( ("$" | ":" | ) ( | | "$" | "_" | "#" )* ) // 2006-05-17 - Matthias Hendler - Bind variablen werden nun als Identifier akzeptiert. //SRT Does NOT seem to like identifiers 2 or fewer characters( ( ) ) @@ -5091,6 +5120,14 @@ TOKEN : //( ( "$" ) ) //( ( "_" ) ) //( ( "#" ) ) + | + ( + "&" + ( + ( | "_" ) ( | | "$" | "_" | "#" )+ + (".")? + )? + ) | ( ( | "$" ) ( | | "$" | "_" | "#" )* ) | @@ -5098,6 +5135,16 @@ TOKEN : ( "\"" ( | | "$" | "_" | "#" )* "\"" ) > | +< LEXICAL_PARAMETER: + ( + "&" + ( + ( | | "$" | "_" | "#" )+ + (".")? + )? + ) +> +| < UNSIGNED_NUMERIC_LITERAL: ( ["e","E"] (["-","+"])? )? (["f","F","d","D"])? > | < #FLOAT_LITERAL: ( "." )? | "." > diff --git a/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/ast/PLSQLParserVisitorAdapter.java b/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/ast/PLSQLParserVisitorAdapter.java index 81e247e122..e32d89e7ce 100644 --- a/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/ast/PLSQLParserVisitorAdapter.java +++ b/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/ast/PLSQLParserVisitorAdapter.java @@ -165,6 +165,11 @@ public class PLSQLParserVisitorAdapter implements PLSQLParserVisitor { public Object visit(ASTRead2NextOccurrence node, Object data) { return visit((PLSQLNode) node, data); } + + @Override + public Object visit(ASTRead2NextTokenOccurrence node, Object data) { + return visit((PLSQLNode) node, data); + } @Override public Object visit(ASTReadPastNextOccurrence node, Object data) { diff --git a/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/rule/AbstractPLSQLRule.java b/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/rule/AbstractPLSQLRule.java index 274897c1fd..587c9bc0aa 100644 --- a/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/rule/AbstractPLSQLRule.java +++ b/pmd-plsql/src/main/java/net/sourceforge/pmd/lang/plsql/rule/AbstractPLSQLRule.java @@ -161,6 +161,7 @@ import net.sourceforge.pmd.lang.plsql.ast.ASTQueryBlock; import net.sourceforge.pmd.lang.plsql.ast.ASTQueryPartitionClause; import net.sourceforge.pmd.lang.plsql.ast.ASTRaiseStatement; import net.sourceforge.pmd.lang.plsql.ast.ASTRead2NextOccurrence; +import net.sourceforge.pmd.lang.plsql.ast.ASTRead2NextTokenOccurrence; import net.sourceforge.pmd.lang.plsql.ast.ASTReadPastNextOccurrence; import net.sourceforge.pmd.lang.plsql.ast.ASTReferencesClause; import net.sourceforge.pmd.lang.plsql.ast.ASTRegexpLikeCondition; @@ -482,6 +483,11 @@ public abstract class AbstractPLSQLRule extends AbstractRule implements PLSQLPar return visit((PLSQLNode) node, data); } + @Override + public Object visit(ASTRead2NextTokenOccurrence node, Object data) { + return visit((PLSQLNode) node, data); + } + @Override public Object visit(ASTReadPastNextOccurrence node, Object data) { return visit((PLSQLNode) node, data);