From e1b8c2f5e57436b515001a70e717bba455b1da80 Mon Sep 17 00:00:00 2001 From: Will Wray Date: Thu, 24 Nov 2022 07:09:15 -0400 Subject: [PATCH 1/6] Add PP_NUMBER, remove CPP_INTEGER, CPP_FLOAT A simple proof of concept change that fixes #79. With it, pcpp can do codegen using the IREPEAT library. I believe it's conceptually correct, but my Python may not be; please test this against your suite and review the method (hack) carefully. There's not much code! Mostly deletions. The change removes CPP_INTEGER, effectively replacing it with PP_NUMBER, and entirely removes CPP_FLOAT as superfluous for preprocessing purposes. pp-number is sufficient for preprocessing to stage 4 The pp-number regex in the issue is incorrect, lifted from unpublished WG21 https://isocpp.org/files/papers/D2180R0.html "pp-number makes cpp dumber" (best proposal title ever). Instead, I crafted a regex based on the lastest C++ draft https://eel.is/c++draft/lex.ppnumber#ntref:pp-number which accepts character ' as digit separator: regex string r'\.?\d(\.|[\w_]|\'[\w_]|[eEpP][-+])*' (also admits binary literals, with digit separator, of course, so they can now be added to the Value parsing code) Only the conditional evaluator is required to interpret the numbers as integer constant expressions. This is achieved by hacky means: def p_expression_number(p): 'expression : PP_NUMBER' try: p[0] = Value(p[1]) except: p[0] = p[1] The idea is that if the parsed string p[1] can be interpreted as an integer constant-expression Value(p[1]) then do so, otherwise simply pass through the string for possible further pasting and processing. A robust method might check p[1] against the CPP_INTEGER regex (removed in this commit) for a full match, consuming all input. On the other hand, relying on Value to validate the input while parsing and to raise an exception on failure may be Pythonic. It seems that pp-number itself is a hack in the standard; I see no way to incorporate pp-number alongside INTEGER and FLOAT tokens meaningful in C; but then there's no need to. Happy Thanksgiving! --- pcpp/evaluator.py | 10 +++++++--- pcpp/parser.py | 13 +++++-------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/pcpp/evaluator.py b/pcpp/evaluator.py index 38abe20..498ec1f 100644 --- a/pcpp/evaluator.py +++ b/pcpp/evaluator.py @@ -357,7 +357,7 @@ def __gt__(self, other): # The subset of tokens from Preprocessor used in preprocessor expressions tokens = ( - 'CPP_ID', 'CPP_INTEGER', 'CPP_CHAR', 'CPP_STRING', + 'CPP_ID', 'PP_NUMBER', 'CPP_CHAR', 'CPP_STRING', 'CPP_PLUS', 'CPP_MINUS', 'CPP_STAR', 'CPP_FSLASH', 'CPP_PERCENT', 'CPP_BAR', 'CPP_AMPERSAND', 'CPP_TILDE', 'CPP_HAT', 'CPP_LESS', 'CPP_GREATER', 'CPP_EXCLAMATION', 'CPP_QUESTION', 'CPP_LPAREN', 'CPP_RPAREN', @@ -394,8 +394,12 @@ def p_error(p): raise SyntaxError("at EOF") def p_expression_number(p): - 'expression : CPP_INTEGER' - p[0] = Value(p[1]) + 'expression : PP_NUMBER' + try: + p[0] = Value(p[1]) + except: + p[0] = p[1] + def p_expression_character(p): 'expression : CPP_CHAR' diff --git a/pcpp/parser.py b/pcpp/parser.py index 8e6a10a..6e55987 100644 --- a/pcpp/parser.py +++ b/pcpp/parser.py @@ -27,7 +27,7 @@ # ----------------------------------------------------------------------------- tokens = ( - 'CPP_ID','CPP_INTEGER', 'CPP_FLOAT', 'CPP_STRING', 'CPP_CHAR', 'CPP_WS', 'CPP_LINECONT', 'CPP_COMMENT1', 'CPP_COMMENT2', + 'CPP_ID', 'PP_NUMBER', 'CPP_STRING', 'CPP_CHAR', 'CPP_WS', 'CPP_LINECONT', 'CPP_COMMENT1', 'CPP_COMMENT2', 'CPP_POUND','CPP_DPOUND', 'CPP_PLUS', 'CPP_MINUS', 'CPP_STAR', 'CPP_FSLASH', 'CPP_PERCENT', 'CPP_BAR', 'CPP_AMPERSAND', 'CPP_TILDE', 'CPP_HAT', 'CPP_LESS', 'CPP_GREATER', 'CPP_EQUAL', 'CPP_EXCLAMATION', 'CPP_QUESTION', 'CPP_LPAREN', 'CPP_RPAREN', 'CPP_LBRACKET', 'CPP_RBRACKET', 'CPP_LCURLY', 'CPP_RCURLY', @@ -111,15 +111,12 @@ def t_CPP_LINECONT(t): # Identifier t_CPP_ID = r'[A-Za-z_][\w_]*' -# Integer literal -def CPP_INTEGER(t): - r'(((((0x)|(0X))[0-9a-fA-F]+)|(\d+))([uU][lL]|[lL][uU]|[uU]|[lL])?)' +# Preprocessor number +def PP_NUMBER(t): + r'\.?\d(\.|[\w_]|\'[\w_]|[eEpP][-+])*' return t -t_CPP_INTEGER = CPP_INTEGER - -# Floating literal -t_CPP_FLOAT = r'((\d+)(\.\d+)(e(\+|-)?(\d+))?|(\d+)e(\+|-)?(\d+))([lL]|[fF])?' +t_PP_NUMBER = PP_NUMBER # String literal def t_CPP_STRING(t): From ad71ecd34c6e100b0c9f2958d0367cc1d0f687ec Mon Sep 17 00:00:00 2001 From: Will Wray Date: Sun, 27 Nov 2022 17:19:47 -0400 Subject: [PATCH 2/6] Add tests/issue0079.py --- tests/issue0079.py | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 tests/issue0079.py diff --git a/tests/issue0079.py b/tests/issue0079.py new file mode 100644 index 0000000..98c83f4 --- /dev/null +++ b/tests/issue0079.py @@ -0,0 +1,39 @@ +from __future__ import absolute_import, print_function +import unittest, time +try: + from StringIO import StringIO +except ImportError: + from io import StringIO + +class runner(object): + def runTest(self): + from pcpp import Preprocessor, OutputDirective, Action + import os, sys, re + + p = Preprocessor() + p.parse(self.input) + oh = StringIO() + p.write(oh) + print("ok") + if oh.getvalue() != self.output: + print("Should be:\n" + self.output + "EOF\n", file = sys.stderr) + print("\nWas:\n" + oh.getvalue()+"EOF\n", file = sys.stderr) + self.assertEqual(p.return_code, 0) + self.assertEqual(oh.getvalue(), self.output) + +class pp_number_pasting(unittest.TestCase, runner): + input = r"""#define CAT_(A,B)A##B +#define CAT(A,B)CAT_(A,B) +#define Ox 0x +#if CAT(Ox,1) +PP_NUMBER pasted ok +#else +PP_NUMBER paste fail +#endif +""" + output = r""" + + + +PP_NUMBER pasted ok +""" \ No newline at end of file From 4207a3126d8d4216aa543f53927bbe4d64a0cfab Mon Sep 17 00:00:00 2001 From: Will Wray Date: Mon, 28 Nov 2022 08:49:10 -0400 Subject: [PATCH 3/6] Commit generated lextab and parsetab Not sure if its right to commit generated tables in the PR so here they are in a separate commit to pick or drop. --- pcpp/lextab.py | 4 +-- pcpp/parsetab.py | 68 ++++++++++++++++++++++++------------------------ 2 files changed, 36 insertions(+), 36 deletions(-) diff --git a/pcpp/lextab.py b/pcpp/lextab.py index 8488774..e9896eb 100644 --- a/pcpp/lextab.py +++ b/pcpp/lextab.py @@ -1,10 +1,10 @@ # lextab.py. This file automatically created by PLY (version 3.11). Don't edit! _tabversion = '3.10' -_lextokens = set(('CPP_AMPERSAND', 'CPP_ANDEQUAL', 'CPP_BAR', 'CPP_BSLASH', 'CPP_CHAR', 'CPP_COLON', 'CPP_COMMA', 'CPP_COMMENT1', 'CPP_COMMENT2', 'CPP_DEREFERENCE', 'CPP_DIVIDEEQUAL', 'CPP_DOT', 'CPP_DPOUND', 'CPP_DQUOTE', 'CPP_EQUAL', 'CPP_EQUALITY', 'CPP_EXCLAMATION', 'CPP_FLOAT', 'CPP_FSLASH', 'CPP_GREATER', 'CPP_GREATEREQUAL', 'CPP_HAT', 'CPP_ID', 'CPP_INEQUALITY', 'CPP_INTEGER', 'CPP_LBRACKET', 'CPP_LCURLY', 'CPP_LESS', 'CPP_LESSEQUAL', 'CPP_LINECONT', 'CPP_LOGICALAND', 'CPP_LOGICALOR', 'CPP_LPAREN', 'CPP_LSHIFT', 'CPP_LSHIFTEQUAL', 'CPP_MINUS', 'CPP_MINUSEQUAL', 'CPP_MINUSMINUS', 'CPP_MULTIPLYEQUAL', 'CPP_OREQUAL', 'CPP_PERCENT', 'CPP_PERCENTEQUAL', 'CPP_PLUS', 'CPP_PLUSEQUAL', 'CPP_PLUSPLUS', 'CPP_POUND', 'CPP_QUESTION', 'CPP_RBRACKET', 'CPP_RCURLY', 'CPP_RPAREN', 'CPP_RSHIFT', 'CPP_RSHIFTEQUAL', 'CPP_SEMICOLON', 'CPP_SQUOTE', 'CPP_STAR', 'CPP_STRING', 'CPP_TILDE', 'CPP_WS', 'CPP_XOREQUAL')) +_lextokens = set(('CPP_AMPERSAND', 'CPP_ANDEQUAL', 'CPP_BAR', 'CPP_BSLASH', 'CPP_CHAR', 'CPP_COLON', 'CPP_COMMA', 'CPP_COMMENT1', 'CPP_COMMENT2', 'CPP_DEREFERENCE', 'CPP_DIVIDEEQUAL', 'CPP_DOT', 'CPP_DPOUND', 'CPP_DQUOTE', 'CPP_EQUAL', 'CPP_EQUALITY', 'CPP_EXCLAMATION', 'CPP_FSLASH', 'CPP_GREATER', 'CPP_GREATEREQUAL', 'CPP_HAT', 'CPP_ID', 'CPP_INEQUALITY', 'CPP_LBRACKET', 'CPP_LCURLY', 'CPP_LESS', 'CPP_LESSEQUAL', 'CPP_LINECONT', 'CPP_LOGICALAND', 'CPP_LOGICALOR', 'CPP_LPAREN', 'CPP_LSHIFT', 'CPP_LSHIFTEQUAL', 'CPP_MINUS', 'CPP_MINUSEQUAL', 'CPP_MINUSMINUS', 'CPP_MULTIPLYEQUAL', 'CPP_OREQUAL', 'CPP_PERCENT', 'CPP_PERCENTEQUAL', 'CPP_PLUS', 'CPP_PLUSEQUAL', 'CPP_PLUSPLUS', 'CPP_POUND', 'CPP_QUESTION', 'CPP_RBRACKET', 'CPP_RCURLY', 'CPP_RPAREN', 'CPP_RSHIFT', 'CPP_RSHIFTEQUAL', 'CPP_SEMICOLON', 'CPP_SQUOTE', 'CPP_STAR', 'CPP_STRING', 'CPP_TILDE', 'CPP_WS', 'CPP_XOREQUAL', 'PP_NUMBER')) _lexreflags = 64 _lexliterals = '+-*/%|&~^<>=!?()[]{}.,;:\\\'"' _lexstateinfo = {'INITIAL': 'inclusive'} -_lexstatere = {'INITIAL': [('(?P([ \\t]+|\\n))|(?P\\\\[ \\t]*\\n)|(?P(((((0x)|(0X))[0-9a-fA-F]+)|(\\d+))([uU][lL]|[lL][uU]|[uU]|[lL])?))|(?P\\"([^\\\\\\n]|(\\\\(.|\\n)))*?\\")|(?P(L)?\\\'([^\\\\\\n]|(\\\\(.|\\n)))*?\\\')|(?P(/\\*(.|\\n)*?\\*/))|(?P(//[^\\n]*))|(?P((\\d+)(\\.\\d+)(e(\\+|-)?(\\d+))?|(\\d+)e(\\+|-)?(\\d+))([lL]|[fF])?)|(?P[A-Za-z_][\\w_]*)|(?P\\|\\|)|(?P\\+\\+)|(?P\\#\\#)|(?P<<=)|(?P\\|=)|(?P\\+=)|(?P>>=)|(?P\\*=)|(?P\\|)|(?P/=)|(?P\\#)|(?P%=)|(?P->)|(?P\\))|(?P&=)|(?P\\])|(?P\\()|(?P>>)|(?P<=)|(?P\\^)|(?P&&)|(?P==)|(?P>=)|(?P\\\\)|(?P-=)|(?P\\.)|(?P--)|(?P\\[)|(?P\\+)|(?P^=)|(?P\\*)|(?P\\?)|(?P<<)|(?P!=)|(?P")|(?P-)|(?P})|(?P>)|(?P<)|(?P\')|(?P!)|(?P{)|(?P=)|(?P/)|(?P:)|(?P&)|(?P,)|(?P~)|(?P;)|(?P%)', [None, ('t_CPP_WS', 'CPP_WS'), None, ('t_CPP_LINECONT', 'CPP_LINECONT'), ('t_CPP_INTEGER', 'CPP_INTEGER'), None, None, None, None, None, None, None, None, ('t_CPP_STRING', 'CPP_STRING'), None, None, None, ('t_CPP_CHAR', 'CPP_CHAR'), None, None, None, None, ('t_CPP_COMMENT1', 'CPP_COMMENT1'), None, None, ('t_CPP_COMMENT2', 'CPP_COMMENT2'), None, (None, 'CPP_FLOAT'), None, None, None, None, None, None, None, None, None, None, (None, 'CPP_ID'), (None, 'CPP_LOGICALOR'), (None, 'CPP_PLUSPLUS'), (None, 'CPP_DPOUND'), (None, 'CPP_LSHIFTEQUAL'), (None, 'CPP_OREQUAL'), (None, 'CPP_PLUSEQUAL'), (None, 'CPP_RSHIFTEQUAL'), (None, 'CPP_MULTIPLYEQUAL'), (None, 'CPP_BAR'), (None, 'CPP_DIVIDEEQUAL'), (None, 'CPP_POUND'), (None, 'CPP_PERCENTEQUAL'), (None, 'CPP_DEREFERENCE'), (None, 'CPP_RPAREN'), (None, 'CPP_ANDEQUAL'), (None, 'CPP_RBRACKET'), (None, 'CPP_LPAREN'), (None, 'CPP_RSHIFT'), (None, 'CPP_LESSEQUAL'), (None, 'CPP_HAT'), (None, 'CPP_LOGICALAND'), (None, 'CPP_EQUALITY'), (None, 'CPP_GREATEREQUAL'), (None, 'CPP_BSLASH'), (None, 'CPP_MINUSEQUAL'), (None, 'CPP_DOT'), (None, 'CPP_MINUSMINUS'), (None, 'CPP_LBRACKET'), (None, 'CPP_PLUS'), (None, 'CPP_XOREQUAL'), (None, 'CPP_STAR'), (None, 'CPP_QUESTION'), (None, 'CPP_LSHIFT'), (None, 'CPP_INEQUALITY'), (None, 'CPP_DQUOTE'), (None, 'CPP_MINUS'), (None, 'CPP_RCURLY'), (None, 'CPP_GREATER'), (None, 'CPP_LESS'), (None, 'CPP_SQUOTE'), (None, 'CPP_EXCLAMATION'), (None, 'CPP_LCURLY'), (None, 'CPP_EQUAL'), (None, 'CPP_FSLASH'), (None, 'CPP_COLON'), (None, 'CPP_AMPERSAND'), (None, 'CPP_COMMA'), (None, 'CPP_TILDE'), (None, 'CPP_SEMICOLON'), (None, 'CPP_PERCENT')])]} +_lexstatere = {'INITIAL': [('(?P([ \\t]+|\\n))|(?P\\\\[ \\t]*\\n)|(?P\\.?\\d(\\.|[\\w_]|\\\'[\\w_]|[eEpP][-+])*)|(?P\\"([^\\\\\\n]|(\\\\(.|\\n)))*?\\")|(?P(L)?\\\'([^\\\\\\n]|(\\\\(.|\\n)))*?\\\')|(?P(/\\*(.|\\n)*?\\*/))|(?P(//[^\\n]*))|(?P[A-Za-z_][\\w_]*)|(?P\\#\\#)|(?P\\|\\|)|(?P\\+\\+)|(?P\\|=)|(?P\\*=)|(?P\\+=)|(?P<<=)|(?P>>=)|(?P\\#)|(?P\\+)|(?P\\*)|(?P\\|)|(?P\\^)|(?P\\?)|(?P\\()|(?P\\))|(?P\\[)|(?P\\])|(?P\\.)|(?P\\\\)|(?P->)|(?P-=)|(?P--)|(?P<<)|(?P<=)|(?P>>)|(?P>=)|(?P&&)|(?P&=)|(?P==)|(?P!=)|(?P^=)|(?P/=)|(?P%=)|(?P-)|(?P/)|(?P%)|(?P&)|(?P~)|(?P<)|(?P>)|(?P=)|(?P!)|(?P{)|(?P})|(?P,)|(?P;)|(?P:)|(?P\')|(?P")', [None, ('t_CPP_WS', 'CPP_WS'), None, ('t_CPP_LINECONT', 'CPP_LINECONT'), ('t_PP_NUMBER', 'PP_NUMBER'), None, ('t_CPP_STRING', 'CPP_STRING'), None, None, None, ('t_CPP_CHAR', 'CPP_CHAR'), None, None, None, None, ('t_CPP_COMMENT1', 'CPP_COMMENT1'), None, None, ('t_CPP_COMMENT2', 'CPP_COMMENT2'), None, (None, 'CPP_ID'), (None, 'CPP_DPOUND'), (None, 'CPP_LOGICALOR'), (None, 'CPP_PLUSPLUS'), (None, 'CPP_OREQUAL'), (None, 'CPP_MULTIPLYEQUAL'), (None, 'CPP_PLUSEQUAL'), (None, 'CPP_LSHIFTEQUAL'), (None, 'CPP_RSHIFTEQUAL'), (None, 'CPP_POUND'), (None, 'CPP_PLUS'), (None, 'CPP_STAR'), (None, 'CPP_BAR'), (None, 'CPP_HAT'), (None, 'CPP_QUESTION'), (None, 'CPP_LPAREN'), (None, 'CPP_RPAREN'), (None, 'CPP_LBRACKET'), (None, 'CPP_RBRACKET'), (None, 'CPP_DOT'), (None, 'CPP_BSLASH'), (None, 'CPP_DEREFERENCE'), (None, 'CPP_MINUSEQUAL'), (None, 'CPP_MINUSMINUS'), (None, 'CPP_LSHIFT'), (None, 'CPP_LESSEQUAL'), (None, 'CPP_RSHIFT'), (None, 'CPP_GREATEREQUAL'), (None, 'CPP_LOGICALAND'), (None, 'CPP_ANDEQUAL'), (None, 'CPP_EQUALITY'), (None, 'CPP_INEQUALITY'), (None, 'CPP_XOREQUAL'), (None, 'CPP_DIVIDEEQUAL'), (None, 'CPP_PERCENTEQUAL'), (None, 'CPP_MINUS'), (None, 'CPP_FSLASH'), (None, 'CPP_PERCENT'), (None, 'CPP_AMPERSAND'), (None, 'CPP_TILDE'), (None, 'CPP_LESS'), (None, 'CPP_GREATER'), (None, 'CPP_EQUAL'), (None, 'CPP_EXCLAMATION'), (None, 'CPP_LCURLY'), (None, 'CPP_RCURLY'), (None, 'CPP_COMMA'), (None, 'CPP_SEMICOLON'), (None, 'CPP_COLON'), (None, 'CPP_SQUOTE'), (None, 'CPP_DQUOTE')])]} _lexstateignore = {'INITIAL': ''} _lexstateerrorf = {'INITIAL': 't_error'} _lexstateeoff = {} diff --git a/pcpp/parsetab.py b/pcpp/parsetab.py index ed627c4..406a798 100644 --- a/pcpp/parsetab.py +++ b/pcpp/parsetab.py @@ -6,9 +6,9 @@ _lr_method = 'LALR' -_lr_signature = 'leftCPP_COMMAleftCPP_QUESTIONCPP_COLONleftCPP_LOGICALORleftCPP_LOGICALANDleftCPP_BARleftCPP_HATleftCPP_AMPERSANDleftCPP_EQUALITYCPP_INEQUALITYleftCPP_LESSCPP_LESSEQUALCPP_GREATERCPP_GREATEREQUALleftCPP_LSHIFTCPP_RSHIFTleftCPP_PLUSCPP_MINUSleftCPP_STARCPP_FSLASHCPP_PERCENTrightUPLUSUMINUSCPP_EXCLAMATIONCPP_TILDECPP_AMPERSAND CPP_BAR CPP_CHAR CPP_COLON CPP_COMMA CPP_EQUALITY CPP_EXCLAMATION CPP_FSLASH CPP_GREATER CPP_GREATEREQUAL CPP_HAT CPP_ID CPP_INEQUALITY CPP_INTEGER CPP_LESS CPP_LESSEQUAL CPP_LOGICALAND CPP_LOGICALOR CPP_LPAREN CPP_LSHIFT CPP_MINUS CPP_PERCENT CPP_PLUS CPP_QUESTION CPP_RPAREN CPP_RSHIFT CPP_STAR CPP_STRING CPP_TILDEexpression : CPP_INTEGERexpression : CPP_CHAR\n expression : CPP_STRING\n | CPP_LESS expression CPP_GREATER\n expression : CPP_LPAREN expression CPP_RPARENexpression : CPP_PLUS expression %prec UPLUSexpression : CPP_MINUS expression %prec UMINUS\n expression : CPP_EXCLAMATION expression\n | CPP_TILDE expression\n \n expression : expression CPP_STAR expression\n | expression CPP_FSLASH expression\n | expression CPP_PERCENT expression\n | expression CPP_PLUS expression\n | expression CPP_MINUS expression\n | expression CPP_LSHIFT expression\n | expression CPP_RSHIFT expression\n | expression CPP_LESS expression\n | expression CPP_LESSEQUAL expression\n | expression CPP_GREATER expression\n | expression CPP_GREATEREQUAL expression\n | expression CPP_EQUALITY expression\n | expression CPP_INEQUALITY expression\n | expression CPP_AMPERSAND expression\n | expression CPP_HAT expression\n | expression CPP_BAR expression\n | expression CPP_LOGICALAND expression\n | expression CPP_LOGICALOR expression\n | expression CPP_COMMA expression\n expression : expression CPP_QUESTION expression CPP_COLON expressionexpression : CPP_ID CPP_LPAREN expression CPP_RPARENexpression : CPP_ID' +_lr_signature = 'leftCPP_COMMAleftCPP_QUESTIONCPP_COLONleftCPP_LOGICALORleftCPP_LOGICALANDleftCPP_BARleftCPP_HATleftCPP_AMPERSANDleftCPP_EQUALITYCPP_INEQUALITYleftCPP_LESSCPP_LESSEQUALCPP_GREATERCPP_GREATEREQUALleftCPP_LSHIFTCPP_RSHIFTleftCPP_PLUSCPP_MINUSleftCPP_STARCPP_FSLASHCPP_PERCENTrightUPLUSUMINUSCPP_EXCLAMATIONCPP_TILDECPP_AMPERSAND CPP_BAR CPP_CHAR CPP_COLON CPP_COMMA CPP_EQUALITY CPP_EXCLAMATION CPP_FSLASH CPP_GREATER CPP_GREATEREQUAL CPP_HAT CPP_ID CPP_INEQUALITY CPP_LESS CPP_LESSEQUAL CPP_LOGICALAND CPP_LOGICALOR CPP_LPAREN CPP_LSHIFT CPP_MINUS CPP_PERCENT CPP_PLUS CPP_QUESTION CPP_RPAREN CPP_RSHIFT CPP_STAR CPP_STRING CPP_TILDE PP_NUMBERexpression : PP_NUMBERexpression : CPP_CHAR\n expression : CPP_STRING\n | CPP_LESS expression CPP_GREATER\n expression : CPP_LPAREN expression CPP_RPARENexpression : CPP_PLUS expression %prec UPLUSexpression : CPP_MINUS expression %prec UMINUS\n expression : CPP_EXCLAMATION expression\n | CPP_TILDE expression\n \n expression : expression CPP_STAR expression\n | expression CPP_FSLASH expression\n | expression CPP_PERCENT expression\n | expression CPP_PLUS expression\n | expression CPP_MINUS expression\n | expression CPP_LSHIFT expression\n | expression CPP_RSHIFT expression\n | expression CPP_LESS expression\n | expression CPP_LESSEQUAL expression\n | expression CPP_GREATER expression\n | expression CPP_GREATEREQUAL expression\n | expression CPP_EQUALITY expression\n | expression CPP_INEQUALITY expression\n | expression CPP_AMPERSAND expression\n | expression CPP_HAT expression\n | expression CPP_BAR expression\n | expression CPP_LOGICALAND expression\n | expression CPP_LOGICALOR expression\n | expression CPP_COMMA expression\n expression : expression CPP_QUESTION expression CPP_COLON expressionexpression : CPP_ID CPP_LPAREN expression CPP_RPARENexpression : CPP_ID' -_lr_action_items = {'CPP_ID':([0,3,4,6,8,9,11,12,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,41,63,],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,]),'CPP_LSHIFT':([1,2,5,7,10,13,14,15,16,17,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,64,],[-31,-3,-2,-1,18,-8,-6,18,-7,18,-9,18,-5,-4,-15,18,18,18,18,-12,18,18,18,-13,18,-11,18,18,-14,-10,18,18,18,-16,-30,18,]),'CPP_STRING':([0,3,4,6,8,9,11,12,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,41,63,],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,]),'CPP_LESSEQUAL':([1,2,5,7,10,13,14,15,16,17,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,64,],[-31,-3,-2,-1,19,-8,-6,19,-7,19,-9,19,-5,-4,-15,-18,-20,19,19,-12,19,19,19,-13,19,-11,19,19,-14,-10,19,-19,-17,-16,-30,19,]),'CPP_GREATEREQUAL':([1,2,5,7,10,13,14,15,16,17,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,64,],[-31,-3,-2,-1,20,-8,-6,20,-7,20,-9,20,-5,-4,-15,-18,-20,20,20,-12,20,20,20,-13,20,-11,20,20,-14,-10,20,-19,-17,-16,-30,20,]),'CPP_LOGICALOR':([1,2,5,7,10,13,14,15,16,17,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,64,],[-31,-3,-2,-1,21,-8,-6,21,-7,21,-9,21,-5,-4,-15,-18,-20,-27,-26,-12,-23,21,-25,-13,-22,-11,-21,-24,-14,-10,21,-19,-17,-16,-30,21,]),'CPP_LOGICALAND':([1,2,5,7,10,13,14,15,16,17,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,64,],[-31,-3,-2,-1,22,-8,-6,22,-7,22,-9,22,-5,-4,-15,-18,-20,22,-26,-12,-23,22,-25,-13,-22,-11,-21,-24,-14,-10,22,-19,-17,-16,-30,22,]),'CPP_EXCLAMATION':([0,3,4,6,8,9,11,12,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,41,63,],[3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,]),'CPP_PERCENT':([1,2,5,7,10,13,14,15,16,17,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,64,],[-31,-3,-2,-1,23,-8,-6,23,-7,23,-9,23,-5,-4,23,23,23,23,23,-12,23,23,23,23,23,-11,23,23,23,-10,23,23,23,23,-30,23,]),'CPP_AMPERSAND':([1,2,5,7,10,13,14,15,16,17,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,64,],[-31,-3,-2,-1,24,-8,-6,24,-7,24,-9,24,-5,-4,-15,-18,-20,24,24,-12,-23,24,24,-13,-22,-11,-21,24,-14,-10,24,-19,-17,-16,-30,24,]),'CPP_QUESTION':([1,2,5,7,10,13,14,15,16,17,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,64,],[-31,-3,-2,-1,25,-8,-6,25,-7,25,-9,25,-5,-4,-15,-18,-20,-27,-26,-12,-23,25,-25,-13,-22,-11,-21,-24,-14,-10,25,-19,-17,-16,-30,-29,]),'CPP_BAR':([1,2,5,7,10,13,14,15,16,17,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,64,],[-31,-3,-2,-1,26,-8,-6,26,-7,26,-9,26,-5,-4,-15,-18,-20,26,26,-12,-23,26,-25,-13,-22,-11,-21,-24,-14,-10,26,-19,-17,-16,-30,26,]),'$end':([1,2,5,7,10,13,14,16,38,40,41,42,43,44,45,46,47,48,50,51,52,53,54,55,56,57,58,59,60,61,62,64,],[-31,-3,-2,-1,0,-8,-6,-7,-9,-5,-4,-15,-18,-20,-27,-26,-12,-23,-25,-13,-22,-11,-21,-24,-14,-10,-28,-19,-17,-16,-30,-29,]),'CPP_PLUS':([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,],[4,-31,-3,4,4,-2,4,-1,4,4,27,4,4,-8,-6,27,-7,27,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,-9,27,-5,4,27,27,27,27,27,-12,27,27,27,-13,27,-11,27,27,-14,-10,27,27,27,27,-30,4,27,]),'CPP_INEQUALITY':([1,2,5,7,10,13,14,15,16,17,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,64,],[-31,-3,-2,-1,28,-8,-6,28,-7,28,-9,28,-5,-4,-15,-18,-20,28,28,-12,28,28,28,-13,-22,-11,-21,28,-14,-10,28,-19,-17,-16,-30,28,]),'CPP_CHAR':([0,3,4,6,8,9,11,12,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,41,63,],[5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,]),'CPP_LPAREN':([0,1,3,4,6,8,9,11,12,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,41,63,],[6,12,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,]),'CPP_FSLASH':([1,2,5,7,10,13,14,15,16,17,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,64,],[-31,-3,-2,-1,29,-8,-6,29,-7,29,-9,29,-5,-4,29,29,29,29,29,-12,29,29,29,29,29,-11,29,29,29,-10,29,29,29,29,-30,29,]),'CPP_INTEGER':([0,3,4,6,8,9,11,12,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,41,63,],[7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,]),'CPP_HAT':([1,2,5,7,10,13,14,15,16,17,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,64,],[-31,-3,-2,-1,31,-8,-6,31,-7,31,-9,31,-5,-4,-15,-18,-20,31,31,-12,-23,31,31,-13,-22,-11,-21,-24,-14,-10,31,-19,-17,-16,-30,31,]),'CPP_EQUALITY':([1,2,5,7,10,13,14,15,16,17,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,64,],[-31,-3,-2,-1,30,-8,-6,30,-7,30,-9,30,-5,-4,-15,-18,-20,30,30,-12,30,30,30,-13,-22,-11,-21,30,-14,-10,30,-19,-17,-16,-30,30,]),'CPP_MINUS':([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,],[8,-31,-3,8,8,-2,8,-1,8,8,32,8,8,-8,-6,32,-7,32,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,-9,32,-5,8,32,32,32,32,32,-12,32,32,32,-13,32,-11,32,32,-14,-10,32,32,32,32,-30,8,32,]),'CPP_STAR':([1,2,5,7,10,13,14,15,16,17,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,64,],[-31,-3,-2,-1,33,-8,-6,33,-7,33,-9,33,-5,-4,33,33,33,33,33,-12,33,33,33,33,33,-11,33,33,33,-10,33,33,33,33,-30,33,]),'CPP_COMMA':([1,2,5,7,10,13,14,15,16,17,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,64,],[-31,-3,-2,-1,34,-8,-6,34,-7,34,-9,34,-5,-4,-15,-18,-20,-27,-26,-12,-23,34,-25,-13,-22,-11,-21,-24,-14,-10,-28,-19,-17,-16,-30,-29,]),'CPP_GREATER':([1,2,5,7,10,13,14,15,16,17,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,64,],[-31,-3,-2,-1,35,-8,-6,35,-7,41,-9,35,-5,-4,-15,-18,-20,35,35,-12,35,35,35,-13,35,-11,35,35,-14,-10,35,-19,-17,-16,-30,35,]),'CPP_RSHIFT':([1,2,5,7,10,13,14,15,16,17,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,64,],[-31,-3,-2,-1,37,-8,-6,37,-7,37,-9,37,-5,-4,-15,37,37,37,37,-12,37,37,37,-13,37,-11,37,37,-14,-10,37,37,37,-16,-30,37,]),'CPP_LESS':([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,],[9,-31,-3,9,9,-2,9,-1,9,9,36,9,9,-8,-6,36,-7,36,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,-9,36,-5,-4,-15,-18,-20,36,36,-12,36,36,36,-13,36,-11,36,36,-14,-10,36,-19,-17,-16,-30,9,36,]),'CPP_COLON':([1,2,5,7,13,14,16,38,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,64,],[-31,-3,-2,-1,-8,-6,-7,-9,-5,-4,-15,-18,-20,-27,-26,-12,-23,63,-25,-13,-22,-11,-21,-24,-14,-10,-28,-19,-17,-16,-30,-29,]),'CPP_TILDE':([0,3,4,6,8,9,11,12,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,41,63,],[11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,]),'CPP_RPAREN':([1,2,5,7,13,14,15,16,38,39,40,41,42,43,44,45,46,47,48,50,51,52,53,54,55,56,57,58,59,60,61,62,64,],[-31,-3,-2,-1,-8,-6,40,-7,-9,62,-5,-4,-15,-18,-20,-27,-26,-12,-23,-25,-13,-22,-11,-21,-24,-14,-10,-28,-19,-17,-16,-30,-29,]),} +_lr_action_items = {'PP_NUMBER':([0,5,6,7,8,9,10,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,38,59,62,],[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,]),'CPP_CHAR':([0,5,6,7,8,9,10,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,38,59,62,],[3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,]),'CPP_STRING':([0,5,6,7,8,9,10,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,38,59,62,],[4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,]),'CPP_LESS':([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,],[5,19,-1,-2,-3,5,5,5,5,5,5,-31,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,19,19,-6,-7,-8,-9,5,-10,-11,-12,-13,-14,-15,-16,-17,-18,-19,-20,19,19,19,19,19,19,19,19,19,-4,-5,19,5,-30,19,]),'CPP_LPAREN':([0,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,38,59,62,],[6,6,6,6,6,6,6,38,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,]),'CPP_PLUS':([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,],[7,15,-1,-2,-3,7,7,7,7,7,7,-31,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,15,15,-6,-7,-8,-9,7,-10,-11,-12,-13,-14,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,7,-5,15,7,-30,15,]),'CPP_MINUS':([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,],[8,16,-1,-2,-3,8,8,8,8,8,8,-31,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,16,16,-6,-7,-8,-9,8,-10,-11,-12,-13,-14,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,8,-5,16,8,-30,16,]),'CPP_EXCLAMATION':([0,5,6,7,8,9,10,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,38,59,62,],[9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,]),'CPP_TILDE':([0,5,6,7,8,9,10,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,38,59,62,],[10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,]),'CPP_ID':([0,5,6,7,8,9,10,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,38,59,62,],[11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,]),'$end':([1,2,3,4,11,34,35,36,37,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,59,60,63,64,],[0,-1,-2,-3,-31,-6,-7,-8,-9,-10,-11,-12,-13,-14,-15,-16,-17,-18,-19,-20,-21,-22,-23,-24,-25,-26,-27,-28,-4,-5,-30,-29,]),'CPP_STAR':([1,2,3,4,11,32,33,34,35,36,37,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,63,64,],[12,-1,-2,-3,-31,12,12,-6,-7,-8,-9,-10,-11,-12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,-4,-5,12,-30,12,]),'CPP_FSLASH':([1,2,3,4,11,32,33,34,35,36,37,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,63,64,],[13,-1,-2,-3,-31,13,13,-6,-7,-8,-9,-10,-11,-12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,-4,-5,13,-30,13,]),'CPP_PERCENT':([1,2,3,4,11,32,33,34,35,36,37,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,63,64,],[14,-1,-2,-3,-31,14,14,-6,-7,-8,-9,-10,-11,-12,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,-4,-5,14,-30,14,]),'CPP_LSHIFT':([1,2,3,4,11,32,33,34,35,36,37,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,63,64,],[17,-1,-2,-3,-31,17,17,-6,-7,-8,-9,-10,-11,-12,-13,-14,-15,-16,17,17,17,17,17,17,17,17,17,17,17,17,17,-4,-5,17,-30,17,]),'CPP_RSHIFT':([1,2,3,4,11,32,33,34,35,36,37,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,63,64,],[18,-1,-2,-3,-31,18,18,-6,-7,-8,-9,-10,-11,-12,-13,-14,-15,-16,18,18,18,18,18,18,18,18,18,18,18,18,18,-4,-5,18,-30,18,]),'CPP_LESSEQUAL':([1,2,3,4,11,32,33,34,35,36,37,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,63,64,],[20,-1,-2,-3,-31,20,20,-6,-7,-8,-9,-10,-11,-12,-13,-14,-15,-16,-17,-18,-19,-20,20,20,20,20,20,20,20,20,20,-4,-5,20,-30,20,]),'CPP_GREATER':([1,2,3,4,11,32,33,34,35,36,37,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,63,64,],[21,-1,-2,-3,-31,59,21,-6,-7,-8,-9,-10,-11,-12,-13,-14,-15,-16,-17,-18,-19,-20,21,21,21,21,21,21,21,21,21,-4,-5,21,-30,21,]),'CPP_GREATEREQUAL':([1,2,3,4,11,32,33,34,35,36,37,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,63,64,],[22,-1,-2,-3,-31,22,22,-6,-7,-8,-9,-10,-11,-12,-13,-14,-15,-16,-17,-18,-19,-20,22,22,22,22,22,22,22,22,22,-4,-5,22,-30,22,]),'CPP_EQUALITY':([1,2,3,4,11,32,33,34,35,36,37,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,63,64,],[23,-1,-2,-3,-31,23,23,-6,-7,-8,-9,-10,-11,-12,-13,-14,-15,-16,-17,-18,-19,-20,-21,-22,23,23,23,23,23,23,23,-4,-5,23,-30,23,]),'CPP_INEQUALITY':([1,2,3,4,11,32,33,34,35,36,37,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,63,64,],[24,-1,-2,-3,-31,24,24,-6,-7,-8,-9,-10,-11,-12,-13,-14,-15,-16,-17,-18,-19,-20,-21,-22,24,24,24,24,24,24,24,-4,-5,24,-30,24,]),'CPP_AMPERSAND':([1,2,3,4,11,32,33,34,35,36,37,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,63,64,],[25,-1,-2,-3,-31,25,25,-6,-7,-8,-9,-10,-11,-12,-13,-14,-15,-16,-17,-18,-19,-20,-21,-22,-23,25,25,25,25,25,25,-4,-5,25,-30,25,]),'CPP_HAT':([1,2,3,4,11,32,33,34,35,36,37,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,63,64,],[26,-1,-2,-3,-31,26,26,-6,-7,-8,-9,-10,-11,-12,-13,-14,-15,-16,-17,-18,-19,-20,-21,-22,-23,-24,26,26,26,26,26,-4,-5,26,-30,26,]),'CPP_BAR':([1,2,3,4,11,32,33,34,35,36,37,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,63,64,],[27,-1,-2,-3,-31,27,27,-6,-7,-8,-9,-10,-11,-12,-13,-14,-15,-16,-17,-18,-19,-20,-21,-22,-23,-24,-25,27,27,27,27,-4,-5,27,-30,27,]),'CPP_LOGICALAND':([1,2,3,4,11,32,33,34,35,36,37,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,63,64,],[28,-1,-2,-3,-31,28,28,-6,-7,-8,-9,-10,-11,-12,-13,-14,-15,-16,-17,-18,-19,-20,-21,-22,-23,-24,-25,-26,28,28,28,-4,-5,28,-30,28,]),'CPP_LOGICALOR':([1,2,3,4,11,32,33,34,35,36,37,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,63,64,],[29,-1,-2,-3,-31,29,29,-6,-7,-8,-9,-10,-11,-12,-13,-14,-15,-16,-17,-18,-19,-20,-21,-22,-23,-24,-25,-26,-27,29,29,-4,-5,29,-30,29,]),'CPP_COMMA':([1,2,3,4,11,32,33,34,35,36,37,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,63,64,],[30,-1,-2,-3,-31,30,30,-6,-7,-8,-9,-10,-11,-12,-13,-14,-15,-16,-17,-18,-19,-20,-21,-22,-23,-24,-25,-26,-27,-28,30,-4,-5,30,-30,-29,]),'CPP_QUESTION':([1,2,3,4,11,32,33,34,35,36,37,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,63,64,],[31,-1,-2,-3,-31,31,31,-6,-7,-8,-9,-10,-11,-12,-13,-14,-15,-16,-17,-18,-19,-20,-21,-22,-23,-24,-25,-26,-27,31,31,-4,-5,31,-30,-29,]),'CPP_RPAREN':([2,3,4,11,33,34,35,36,37,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,59,60,61,63,64,],[-1,-2,-3,-31,60,-6,-7,-8,-9,-10,-11,-12,-13,-14,-15,-16,-17,-18,-19,-20,-21,-22,-23,-24,-25,-26,-27,-28,-4,-5,63,-30,-29,]),'CPP_COLON':([2,3,4,11,34,35,36,37,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,63,64,],[-1,-2,-3,-31,-6,-7,-8,-9,-10,-11,-12,-13,-14,-15,-16,-17,-18,-19,-20,-21,-22,-23,-24,-25,-26,-27,-28,62,-4,-5,-30,-29,]),} _lr_action = {} for _k, _v in _lr_action_items.items(): @@ -17,7 +17,7 @@ _lr_action[_x][_k] = _y del _lr_action_items -_lr_goto_items = {'expression':([0,3,4,6,8,9,11,12,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,41,63,],[10,13,14,15,16,17,38,39,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,59,64,]),} +_lr_goto_items = {'expression':([0,5,6,7,8,9,10,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,38,59,62,],[1,32,33,34,35,36,37,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,61,48,64,]),} _lr_goto = {} for _k, _v in _lr_goto_items.items(): @@ -27,35 +27,35 @@ del _lr_goto_items _lr_productions = [ ("S' -> expression","S'",1,None,None,None), - ('expression -> CPP_INTEGER','expression',1,'p_expression_number','evaluator.py',396), - ('expression -> CPP_CHAR','expression',1,'p_expression_character','evaluator.py',400), - ('expression -> CPP_STRING','expression',1,'p_expression_string','evaluator.py',405), - ('expression -> CPP_LESS expression CPP_GREATER','expression',3,'p_expression_string','evaluator.py',406), - ('expression -> CPP_LPAREN expression CPP_RPAREN','expression',3,'p_expression_group','evaluator.py',411), - ('expression -> CPP_PLUS expression','expression',2,'p_expression_uplus','evaluator.py',415), - ('expression -> CPP_MINUS expression','expression',2,'p_expression_uminus','evaluator.py',419), - ('expression -> CPP_EXCLAMATION expression','expression',2,'p_expression_unop','evaluator.py',424), - ('expression -> CPP_TILDE expression','expression',2,'p_expression_unop','evaluator.py',425), - ('expression -> expression CPP_STAR expression','expression',3,'p_expression_binop','evaluator.py',437), - ('expression -> expression CPP_FSLASH expression','expression',3,'p_expression_binop','evaluator.py',438), - ('expression -> expression CPP_PERCENT expression','expression',3,'p_expression_binop','evaluator.py',439), - ('expression -> expression CPP_PLUS expression','expression',3,'p_expression_binop','evaluator.py',440), - ('expression -> expression CPP_MINUS expression','expression',3,'p_expression_binop','evaluator.py',441), - ('expression -> expression CPP_LSHIFT expression','expression',3,'p_expression_binop','evaluator.py',442), - ('expression -> expression CPP_RSHIFT expression','expression',3,'p_expression_binop','evaluator.py',443), - ('expression -> expression CPP_LESS expression','expression',3,'p_expression_binop','evaluator.py',444), - ('expression -> expression CPP_LESSEQUAL expression','expression',3,'p_expression_binop','evaluator.py',445), - ('expression -> expression CPP_GREATER expression','expression',3,'p_expression_binop','evaluator.py',446), - ('expression -> expression CPP_GREATEREQUAL expression','expression',3,'p_expression_binop','evaluator.py',447), - ('expression -> expression CPP_EQUALITY expression','expression',3,'p_expression_binop','evaluator.py',448), - ('expression -> expression CPP_INEQUALITY expression','expression',3,'p_expression_binop','evaluator.py',449), - ('expression -> expression CPP_AMPERSAND expression','expression',3,'p_expression_binop','evaluator.py',450), - ('expression -> expression CPP_HAT expression','expression',3,'p_expression_binop','evaluator.py',451), - ('expression -> expression CPP_BAR expression','expression',3,'p_expression_binop','evaluator.py',452), - ('expression -> expression CPP_LOGICALAND expression','expression',3,'p_expression_binop','evaluator.py',453), - ('expression -> expression CPP_LOGICALOR expression','expression',3,'p_expression_binop','evaluator.py',454), - ('expression -> expression CPP_COMMA expression','expression',3,'p_expression_binop','evaluator.py',455), - ('expression -> expression CPP_QUESTION expression CPP_COLON expression','expression',5,'p_expression_conditional','evaluator.py',501), - ('expression -> CPP_ID CPP_LPAREN expression CPP_RPAREN','expression',4,'p_expression_function_call','evaluator.py',513), - ('expression -> CPP_ID','expression',1,'p_expression_identifier','evaluator.py',520), + ('expression -> PP_NUMBER','expression',1,'p_expression_number','evaluator.py',397), + ('expression -> CPP_CHAR','expression',1,'p_expression_character','evaluator.py',405), + ('expression -> CPP_STRING','expression',1,'p_expression_string','evaluator.py',410), + ('expression -> CPP_LESS expression CPP_GREATER','expression',3,'p_expression_string','evaluator.py',411), + ('expression -> CPP_LPAREN expression CPP_RPAREN','expression',3,'p_expression_group','evaluator.py',416), + ('expression -> CPP_PLUS expression','expression',2,'p_expression_uplus','evaluator.py',420), + ('expression -> CPP_MINUS expression','expression',2,'p_expression_uminus','evaluator.py',424), + ('expression -> CPP_EXCLAMATION expression','expression',2,'p_expression_unop','evaluator.py',429), + ('expression -> CPP_TILDE expression','expression',2,'p_expression_unop','evaluator.py',430), + ('expression -> expression CPP_STAR expression','expression',3,'p_expression_binop','evaluator.py',442), + ('expression -> expression CPP_FSLASH expression','expression',3,'p_expression_binop','evaluator.py',443), + ('expression -> expression CPP_PERCENT expression','expression',3,'p_expression_binop','evaluator.py',444), + ('expression -> expression CPP_PLUS expression','expression',3,'p_expression_binop','evaluator.py',445), + ('expression -> expression CPP_MINUS expression','expression',3,'p_expression_binop','evaluator.py',446), + ('expression -> expression CPP_LSHIFT expression','expression',3,'p_expression_binop','evaluator.py',447), + ('expression -> expression CPP_RSHIFT expression','expression',3,'p_expression_binop','evaluator.py',448), + ('expression -> expression CPP_LESS expression','expression',3,'p_expression_binop','evaluator.py',449), + ('expression -> expression CPP_LESSEQUAL expression','expression',3,'p_expression_binop','evaluator.py',450), + ('expression -> expression CPP_GREATER expression','expression',3,'p_expression_binop','evaluator.py',451), + ('expression -> expression CPP_GREATEREQUAL expression','expression',3,'p_expression_binop','evaluator.py',452), + ('expression -> expression CPP_EQUALITY expression','expression',3,'p_expression_binop','evaluator.py',453), + ('expression -> expression CPP_INEQUALITY expression','expression',3,'p_expression_binop','evaluator.py',454), + ('expression -> expression CPP_AMPERSAND expression','expression',3,'p_expression_binop','evaluator.py',455), + ('expression -> expression CPP_HAT expression','expression',3,'p_expression_binop','evaluator.py',456), + ('expression -> expression CPP_BAR expression','expression',3,'p_expression_binop','evaluator.py',457), + ('expression -> expression CPP_LOGICALAND expression','expression',3,'p_expression_binop','evaluator.py',458), + ('expression -> expression CPP_LOGICALOR expression','expression',3,'p_expression_binop','evaluator.py',459), + ('expression -> expression CPP_COMMA expression','expression',3,'p_expression_binop','evaluator.py',460), + ('expression -> expression CPP_QUESTION expression CPP_COLON expression','expression',5,'p_expression_conditional','evaluator.py',506), + ('expression -> CPP_ID CPP_LPAREN expression CPP_RPAREN','expression',4,'p_expression_function_call','evaluator.py',518), + ('expression -> CPP_ID','expression',1,'p_expression_identifier','evaluator.py',525), ] From fcafc37772d0e3d99fd065b7c825c9642ad1b0f3 Mon Sep 17 00:00:00 2001 From: Will Wray Date: Wed, 14 Dec 2022 12:01:43 -0400 Subject: [PATCH 4/6] Update PP_NUMBER regex definition The previous regex escaped the digit separator ' as \' - necessary only because the string itself was '' single-quoted. This commit switches to use double-quote "" for the string and removes the now unneeded escape. --- pcpp/parser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pcpp/parser.py b/pcpp/parser.py index 6e55987..73618a3 100644 --- a/pcpp/parser.py +++ b/pcpp/parser.py @@ -113,7 +113,7 @@ def t_CPP_LINECONT(t): # Preprocessor number def PP_NUMBER(t): - r'\.?\d(\.|[\w_]|\'[\w_]|[eEpP][-+])*' + r"\.?\d(?:\.|[\w_]|'[\w_]|[eEpP][-+])*" return t t_PP_NUMBER = PP_NUMBER From 8a5b9d0643066a06de40490110a05ffbf396fd61 Mon Sep 17 00:00:00 2001 From: Will Wray Date: Wed, 14 Dec 2022 12:38:17 -0400 Subject: [PATCH 5/6] Update test to use context manager for StringIO --- tests/issue0079.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/tests/issue0079.py b/tests/issue0079.py index 98c83f4..6c652b1 100644 --- a/tests/issue0079.py +++ b/tests/issue0079.py @@ -12,17 +12,17 @@ def runTest(self): p = Preprocessor() p.parse(self.input) - oh = StringIO() - p.write(oh) - print("ok") - if oh.getvalue() != self.output: - print("Should be:\n" + self.output + "EOF\n", file = sys.stderr) - print("\nWas:\n" + oh.getvalue()+"EOF\n", file = sys.stderr) - self.assertEqual(p.return_code, 0) - self.assertEqual(oh.getvalue(), self.output) + with StringIO() as oh: + p.write(oh) + print("ok") + if oh.getvalue() != self.output: + print("Should be:\n" + self.output + "EOF\n", file = sys.stderr) + print("\nWas:\n" + oh.getvalue()+"EOF\n", file = sys.stderr) + self.assertEqual(p.return_code, 0) + self.assertEqual(oh.getvalue(), self.output) class pp_number_pasting(unittest.TestCase, runner): - input = r"""#define CAT_(A,B)A##B + input = """#define CAT_(A,B)A##B #define CAT(A,B)CAT_(A,B) #define Ox 0x #if CAT(Ox,1) @@ -31,7 +31,7 @@ class pp_number_pasting(unittest.TestCase, runner): PP_NUMBER paste fail #endif """ - output = r""" + output = """ From 9c702df558cd5957502d3bf7d3f59a70eac92440 Mon Sep 17 00:00:00 2001 From: Will Wray Date: Thu, 15 Dec 2022 08:02:14 -0400 Subject: [PATCH 6/6] Revert "Update test to use context manager for StringIO" This reverts commit 8a5b9d0643066a06de40490110a05ffbf396fd61. --- tests/issue0079.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/tests/issue0079.py b/tests/issue0079.py index 6c652b1..98c83f4 100644 --- a/tests/issue0079.py +++ b/tests/issue0079.py @@ -12,17 +12,17 @@ def runTest(self): p = Preprocessor() p.parse(self.input) - with StringIO() as oh: - p.write(oh) - print("ok") - if oh.getvalue() != self.output: - print("Should be:\n" + self.output + "EOF\n", file = sys.stderr) - print("\nWas:\n" + oh.getvalue()+"EOF\n", file = sys.stderr) - self.assertEqual(p.return_code, 0) - self.assertEqual(oh.getvalue(), self.output) + oh = StringIO() + p.write(oh) + print("ok") + if oh.getvalue() != self.output: + print("Should be:\n" + self.output + "EOF\n", file = sys.stderr) + print("\nWas:\n" + oh.getvalue()+"EOF\n", file = sys.stderr) + self.assertEqual(p.return_code, 0) + self.assertEqual(oh.getvalue(), self.output) class pp_number_pasting(unittest.TestCase, runner): - input = """#define CAT_(A,B)A##B + input = r"""#define CAT_(A,B)A##B #define CAT(A,B)CAT_(A,B) #define Ox 0x #if CAT(Ox,1) @@ -31,7 +31,7 @@ class pp_number_pasting(unittest.TestCase, runner): PP_NUMBER paste fail #endif """ - output = """ + output = r"""