Skip to content

Commit

Permalink
Fix for #3603 (#3607)
Browse files Browse the repository at this point in the history
  • Loading branch information
kaby76 authored Jul 15, 2023
1 parent 3f44239 commit d6353f2
Show file tree
Hide file tree
Showing 8 changed files with 120 additions and 8 deletions.
16 changes: 9 additions & 7 deletions cpp/CPP14Parser.g4
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
*/
parser grammar CPP14Parser;
options {
superClass = CPP14ParserBase;
tokenVocab = CPP14Lexer;
}
/*Basic concepts*/
Expand Down Expand Up @@ -629,22 +630,23 @@ memberDeclaratorList:
memberDeclarator (Comma memberDeclarator)*;

memberDeclarator:
declarator (
virtualSpecifierSeq? pureSpecifier?
| braceOrEqualInitializer?
)
| Identifier? attributeSpecifierSeq? Colon constantExpression;
declarator (virtualSpecifierSeq | { this.IsPureSpecifierAllowed() }? pureSpecifier | { this.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;
Expand Down
27 changes: 27 additions & 0 deletions cpp/CSharp/CPP14ParserBase.cs
Original file line number Diff line number Diff line change
@@ -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;
}
}
28 changes: 28 additions & 0 deletions cpp/Dart/CPP14ParserBase.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import 'package:antlr4/antlr4.dart';
import 'dart:io';
import 'dart:convert';
import 'CPP14Parser.dart';

abstract class CPP14ParserBase extends Parser
{
CPP14ParserBase(TokenStream input) : super(input)
{
}

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.runtimeType == ParametersAndQualifiersContext;
}
catch (e)
{
}
return false;
}
}
26 changes: 26 additions & 0 deletions cpp/Java/CPP14ParserBase.java
Original file line number Diff line number Diff line change
@@ -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 (Exception e)
{
}
return false;
}
}
20 changes: 20 additions & 0 deletions cpp/JavaScript/CPP14ParserBase.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import antlr4 from 'antlr4';
import CPP14Parser from './CPP14Parser.js';

export default class CPP14ParserBase extends antlr4.Parser {
constructor(input) {
super(input);
}

IsPureSpecifierAllowed() {
try {
var x = this._ctx; // memberDeclarator
var c = x.getChild(0).getChild(0);
var c2 = c.getChild(0);
var p = c2.getChild(1);
return p.constructor === CPP14Parser.ParametersAndQualifiersContext;
} catch (e) {
}
return false;
}
}
2 changes: 1 addition & 1 deletion cpp/desc.xml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8" ?>
<desc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../_scripts/desc.xsd">
<targets>Dart;Java;JavaScript</targets>
<targets>CSharp;Dart;Java;JavaScript</targets>
</desc>
8 changes: 8 additions & 0 deletions cpp/examples/pure-specifier.cpp
Original file line number Diff line number Diff line change
@@ -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;
};
1 change: 1 addition & 0 deletions cpp/examples/pure-specifier.cpp.tree
Original file line number Diff line number Diff line change
@@ -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))) ;)) })))) ;)))) <EOF>)

0 comments on commit d6353f2

Please sign in to comment.