From 8a721c890a1f12bad9151af749952f4607f1dea7 Mon Sep 17 00:00:00 2001 From: Ken Domino Date: Wed, 12 Jul 2023 13:27:25 -0400 Subject: [PATCH] Fixing CSharp and Java ports. --- cpp/CPP14Parser.g4 | 16 +++++++++------- cpp/CSharp/CPP14ParserBase.cs | 27 +++++++++++++++++++++++++++ cpp/Java/CPP14ParserBase.java | 26 ++++++++++++++++++++++++++ cpp/desc.xml | 2 +- cpp/examples/pure-specifier.cpp | 8 ++++++++ cpp/examples/pure-specifier.cpp.tree | 1 + 6 files changed, 72 insertions(+), 8 deletions(-) create mode 100644 cpp/CSharp/CPP14ParserBase.cs create mode 100644 cpp/Java/CPP14ParserBase.java create mode 100644 cpp/examples/pure-specifier.cpp create mode 100644 cpp/examples/pure-specifier.cpp.tree diff --git a/cpp/CPP14Parser.g4 b/cpp/CPP14Parser.g4 index 6c4d848544..bb95631517 100644 --- a/cpp/CPP14Parser.g4 +++ b/cpp/CPP14Parser.g4 @@ -21,6 +21,7 @@ */ parser grammar CPP14Parser; options { + superClass = CPP14ParserBase; tokenVocab = CPP14Lexer; } /*Basic concepts*/ @@ -629,22 +630,23 @@ memberDeclaratorList: memberDeclarator (Comma memberDeclarator)*; memberDeclarator: - declarator ( - virtualSpecifierSeq? pureSpecifier? - | braceOrEqualInitializer? - ) - | Identifier? attributeSpecifierSeq? Colon constantExpression; + declarator (virtualSpecifierSeq | { IsPureSpecifierAllowed() }? pureSpecifier | { IsPureSpecifierAllowed() }? virtualSpecifierSeq pureSpecifier | braceOrEqualInitializer) + | declarator + | Identifier? attributeSpecifierSeq? Colon constantExpression + ; virtualSpecifierSeq: virtualSpecifier+; virtualSpecifier: Override | Final; + /* purespecifier: Assign '0'//Conflicts with the lexer ; */ pureSpecifier: - Assign val = OctalLiteral {if($val.text.compareTo("0")!=0) throw new InputMismatchException(this); - }; + Assign IntegerLiteral + ; + /*Derived classes*/ baseClause: Colon baseSpecifierList; diff --git a/cpp/CSharp/CPP14ParserBase.cs b/cpp/CSharp/CPP14ParserBase.cs new file mode 100644 index 0000000000..b66371a3b3 --- /dev/null +++ b/cpp/CSharp/CPP14ParserBase.cs @@ -0,0 +1,27 @@ +using Antlr4.Runtime; +using System.IO; + +public abstract class CPP14ParserBase : Parser { + + protected CPP14ParserBase(ITokenStream input, TextWriter output, TextWriter errorOutput) + : base(input, output, errorOutput) + { + } + + public bool IsPureSpecifierAllowed() + { + try + { + var x = this.Context; // memberDeclarator + var c = x.GetChild(0).GetChild(0); + var c2 = c.GetChild(0); + var p = c2.GetChild(1); + if (p == null) return false; + return p.GetType() == typeof(CPP14Parser.ParametersAndQualifiersContext); + } + catch + { + } + return false; + } +} diff --git a/cpp/Java/CPP14ParserBase.java b/cpp/Java/CPP14ParserBase.java new file mode 100644 index 0000000000..6ee1071e90 --- /dev/null +++ b/cpp/Java/CPP14ParserBase.java @@ -0,0 +1,26 @@ +import org.antlr.v4.runtime.*; + +public abstract class CPP14ParserBase extends Parser +{ + protected CPP14ParserBase(TokenStream input) + { + super(input); + } + + protected boolean IsPureSpecifierAllowed() + { + try + { + var x = this._ctx; // memberDeclarator + var c = x.getChild(0).getChild(0); + var c2 = c.getChild(0); + var p = c2.getChild(1); + if (p == null) return false; + return (p instanceof CPP14Parser.ParametersAndQualifiersContext); + } + catch + { + } + return false; + } +} diff --git a/cpp/desc.xml b/cpp/desc.xml index 25bd9d4633..cfb5a0fe81 100644 --- a/cpp/desc.xml +++ b/cpp/desc.xml @@ -1,4 +1,4 @@ - Dart;Java;JavaScript + CSharp;Dart;Java;JavaScript diff --git a/cpp/examples/pure-specifier.cpp b/cpp/examples/pure-specifier.cpp new file mode 100644 index 0000000000..00b7a6398d --- /dev/null +++ b/cpp/examples/pure-specifier.cpp @@ -0,0 +1,8 @@ +class Abstract +{ + public: + int x = 0; + virtual void pure_virtual() = 0; + virtual void pure_virtual2() = 0x0; + virtual void pure_virtual3() = 04; +}; diff --git a/cpp/examples/pure-specifier.cpp.tree b/cpp/examples/pure-specifier.cpp.tree new file mode 100644 index 0000000000..ea83186386 --- /dev/null +++ b/cpp/examples/pure-specifier.cpp.tree @@ -0,0 +1 @@ +(translationUnit (declarationseq (declaration (blockDeclaration (simpleDeclaration (declSpecifierSeq (declSpecifier (typeSpecifier (classSpecifier (classHead (classKey class) (classHeadName (className Abstract))) { (memberSpecification (accessSpecifier public) : (memberdeclaration (declSpecifierSeq (declSpecifier (typeSpecifier (trailingTypeSpecifier (simpleTypeSpecifier int))))) (memberDeclaratorList (memberDeclarator (declarator (pointerDeclarator (noPointerDeclarator (declaratorid (idExpression (unqualifiedId x)))))) (braceOrEqualInitializer = (initializerClause (assignmentExpression (conditionalExpression (logicalOrExpression (logicalAndExpression (inclusiveOrExpression (exclusiveOrExpression (andExpression (equalityExpression (relationalExpression (shiftExpression (additiveExpression (multiplicativeExpression (pointerMemberExpression (castExpression (unaryExpression (postfixExpression (primaryExpression (literal 0)))))))))))))))))))))) ;) (memberdeclaration (declSpecifierSeq (declSpecifier (functionSpecifier virtual)) (declSpecifier (typeSpecifier (trailingTypeSpecifier (simpleTypeSpecifier void))))) (memberDeclaratorList (memberDeclarator (declarator (pointerDeclarator (noPointerDeclarator (noPointerDeclarator (declaratorid (idExpression (unqualifiedId pure_virtual)))) (parametersAndQualifiers ( ))))) (pureSpecifier = 0))) ;) (memberdeclaration (declSpecifierSeq (declSpecifier (functionSpecifier virtual)) (declSpecifier (typeSpecifier (trailingTypeSpecifier (simpleTypeSpecifier void))))) (memberDeclaratorList (memberDeclarator (declarator (pointerDeclarator (noPointerDeclarator (noPointerDeclarator (declaratorid (idExpression (unqualifiedId pure_virtual2)))) (parametersAndQualifiers ( ))))) (pureSpecifier = 0x0))) ;) (memberdeclaration (declSpecifierSeq (declSpecifier (functionSpecifier virtual)) (declSpecifier (typeSpecifier (trailingTypeSpecifier (simpleTypeSpecifier void))))) (memberDeclaratorList (memberDeclarator (declarator (pointerDeclarator (noPointerDeclarator (noPointerDeclarator (declaratorid (idExpression (unqualifiedId pure_virtual3)))) (parametersAndQualifiers ( ))))) (pureSpecifier = 04))) ;)) })))) ;)))) ) \ No newline at end of file