From 0184e3db7bb6eff9822474e59a6fc6bc135c1ddf Mon Sep 17 00:00:00 2001 From: Stephen Heumann Date: Fri, 3 Jan 2020 22:47:53 -0600 Subject: [PATCH] Recognize the new keywords from C99 and C11 as such. Specifically, the following will now be tokenized as keywords: _Alignas _Alignof _Atomic _Bool _Complex _Generic _Imaginary _Noreturn _Static_assert _Thread_local restrict ('inline' was also added as a standard keyword in C99, but ORCA/C already treated it as such.) The parser currently has no support for any of these keywords, so for now errors will still be generated if they are used, but this is a first step toward adding support for them. --- CCommon.pas | 10 ++-- Header.pas | 2 +- Scanner.pas | 16 ++++--- Table.asm | 130 +++++++++++++++++++++++++++++++++------------------ Table.macros | 4 +- Table.pas | 4 +- 6 files changed, 104 insertions(+), 62 deletions(-) diff --git a/CCommon.pas b/CCommon.pas index 6aed318..83f31eb 100644 --- a/CCommon.pas +++ b/CCommon.pas @@ -158,14 +158,16 @@ type intconst,uintconst,longconst,ulongconst,doubleconst, stringconst, {reserved words} + _Alignassy,_Alignofsy,_Atomicsy,_Boolsy,_Complexsy, + _Genericsy,_Imaginarysy,_Noreturnsy,_Static_assertsy,_Thread_localsy, autosy,asmsy,breaksy,casesy,charsy, continuesy,constsy,compsy,defaultsy,dosy, doublesy,elsesy,enumsy,externsy,extendedsy, floatsy,forsy,gotosy,ifsy,intsy, - inlinesy,longsy,pascalsy,registersy,returnsy, - shortsy,sizeofsy,staticsy,structsy,switchsy, - segmentsy,signedsy,typedefsy,unionsy,unsignedsy, - voidsy,volatilesy,whilesy, + inlinesy,longsy,pascalsy,registersy,restrictsy, + returnsy,shortsy,sizeofsy,staticsy,structsy, + switchsy,segmentsy,signedsy,typedefsy,unionsy, + unsignedsy,voidsy,volatilesy,whilesy, {reserved symbols} excch,percentch,carotch,andch,asteriskch, minusch,plusch,eqch,tildech,barch, diff --git a/Header.pas b/Header.pas index f701038..f170ee8 100644 --- a/Header.pas +++ b/Header.pas @@ -18,7 +18,7 @@ uses CCommon, MM, Scanner, Symbol, CGI; {$segment 'SCANNER'} const - symFileVersion = 3; {version number of .sym file format} + symFileVersion = 4; {version number of .sym file format} var inhibitHeader: boolean; {should .sym includes be blocked?} diff --git a/Scanner.pas b/Scanner.pas index 50caf2d..46e1856 100644 --- a/Scanner.pas +++ b/Scanner.pas @@ -723,14 +723,16 @@ case token.kind of write('"'); end; + _Alignassy,_Alignofsy,_Atomicsy,_Boolsy,_Complexsy, + _Genericsy,_Imaginarysy,_Noreturnsy,_Static_assertsy,_Thread_localsy, autosy,asmsy,breaksy,casesy,charsy, continuesy,constsy,compsy,defaultsy,dosy, doublesy,elsesy,enumsy,externsy,extendedsy, floatsy,forsy,gotosy,ifsy,intsy, - inlinesy,longsy,pascalsy,registersy,returnsy, - shortsy,sizeofsy,staticsy,structsy,switchsy, - segmentsy,signedsy,typedefsy,unionsy,unsignedsy, - voidsy,volatilesy,whilesy: + inlinesy,longsy,pascalsy,registersy,restrictsy, + returnsy,shortsy,sizeofsy,staticsy,structsy, + switchsy,segmentsy,signedsy,typedefsy,unionsy, + unsignedsy,voidsy,volatilesy,whilesy: write(reservedWords[token.kind]); tildech,questionch,lparench,rparench,lbrackch,rbrackch,lbracech, @@ -3641,9 +3643,9 @@ if expandMacros then {handle macro expansions} end; end; {if} {see if it's a reserved word} -if workString[1] in ['a'..'g','i','l','p','r'..'w'] then - for rword := wordHash[ord(workString[1])-ord('a')] to - pred(wordHash[ord(succ(workString[1]))-ord('a')]) do +if workString[1] in ['_','a'..'g','i','l','p','r'..'w'] then + for rword := wordHash[ord(workString[1])-ord('_')] to + pred(wordHash[ord(succ(workString[1]))-ord('_')]) do if reservedWords[rword] = workString then begin token.kind := rword; token.class := reservedWord; diff --git a/Table.asm b/Table.asm index 3c65c24..dd44e38 100644 --- a/Table.asm +++ b/Table.asm @@ -286,14 +286,16 @@ charSym start single character symbols enum (intconst,uintconst,longconst,ulongconst,doubleconst) enum stringconst ! reserved words + enum (_Alignassy,_Alignofsy,_Atomicsy,_Boolsy,_Complexsy) + enum (_Genericsy,_Imaginarysy,_Noreturnsy,_Static_assertsy,_Thread_localsy) enum (autosy,asmsy,breaksy,casesy,charsy) enum (continuesy,constsy,compsy,defaultsy,dosy) enum (doublesy,elsesy,enumsy,externsy,extendedsy) enum (floatsy,forsy,gotosy,ifsy,intsy) - enum (inlinesy,longsy,pascalsy,registersy,returnsy) - enum (shortsy,sizeofsy,staticsy,structsy,switchsy) - enum (segmentsy,signedsy,typedefsy,unionsy,unsignedsy) - enum (voidsy,volatilesy,whilesy) + enum (inlinesy,longsy,pascalsy,registersy,restrictsy) + enum (returnsy,shortsy,sizeofsy,staticsy,structsy) + enum (switchsy,segmentsy,signedsy,typedefsy,unionsy) + enum (unsignedsy,voidsy,volatilesy,whilesy) ! reserved symbols enum (excch,percentch,carotch,andch,asteriskch) enum (minusch,plusch,eqch,tildech,barch) @@ -355,6 +357,16 @@ icp start in comming priority for expression dc i1'200' ulongconst dc i1'200' doubleconst dc i1'200' stringconst + dc i1'200' _Alignassy + dc i1'200' _Alignofsy + dc i1'200' _Atomicsy + dc i1'200' _Boolsy + dc i1'200' _Complexsy + dc i1'200' _Genericsy + dc i1'200' _Imaginarysy + dc i1'200' _Noreturnsy + dc i1'200' _Static_assertsy + dc i1'200' _Thread_localsy dc i1'200' autosy dc i1'200' asmsy dc i1'200' breaksy @@ -379,6 +391,7 @@ icp start in comming priority for expression dc i1'200' longsy dc i1'200' pascalsy dc i1'200' registersy + dc i1'200' restrictsy dc i1'200' returnsy dc i1'200' shortsy dc i1'16' sizeofsy @@ -509,6 +522,16 @@ isp start in stack priority for expression dc i1'0' ulongconst dc i1'0' doubleconst dc i1'0' stringconst + dc i1'0' _Alignassy + dc i1'0' _Alignofsy + dc i1'0' _Atomicsy + dc i1'0' _Boolsy + dc i1'0' _Complexsy + dc i1'0' _Genericsy + dc i1'0' _Imaginarysy + dc i1'0' _Noreturnsy + dc i1'0' _Static_assertsy + dc i1'0' _Thread_localsy dc i1'0' autosy dc i1'0' asmsy dc i1'0' breaksy @@ -533,6 +556,7 @@ isp start in stack priority for expression dc i1'0' longsy dc i1'0' pascalsy dc i1'0' registersy + dc i1'0' restrictsy dc i1'0' returnsy dc i1'0' shortsy dc i1'16' sizeofsy @@ -798,44 +822,55 @@ nopcodes start end reservedWords start reserved word names - str8 auto - str8 asm - str8 break - str8 case - str8 char - str8 continue - str8 const - str8 comp - str8 default - str8 do - str8 double - str8 else - str8 enum - str8 extern - str8 extended - str8 float - str8 for - str8 goto - str8 if - str8 int - str8 inline - str8 long - str8 pascal - str8 register - str8 return - str8 short - str8 sizeof - str8 static - str8 struct - str8 switch - str8 segment - str8 signed - str8 typedef - str8 union - str8 unsigned - str8 void - str8 volatile - str8 while + str14 _Alignas + str14 _Alignof + str14 _Atomic + str14 _Bool + str14 _Complex + str14 _Generic + str14 _Imaginary + str14 _Noreturn + str14 _Static_assert + str14 _Thread_local + str14 auto + str14 asm + str14 break + str14 case + str14 char + str14 continue + str14 const + str14 comp + str14 default + str14 do + str14 double + str14 else + str14 enum + str14 extern + str14 extended + str14 float + str14 for + str14 goto + str14 if + str14 int + str14 inline + str14 long + str14 pascal + str14 register + str14 restrict + str14 return + str14 short + str14 sizeof + str14 static + str14 struct + str14 switch + str14 segment + str14 signed + str14 typedef + str14 union + str14 unsigned + str14 void + str14 volatile + str14 while end ropcodes start @@ -860,15 +895,18 @@ wordHash start reserved word hash table enum (intconst,uintconst,longconst,ulongconst,doubleconst) enum stringconst ! reserved words + enum (_Alignassy,_Alignofsy,_Atomicsy,_Boolsy,_Complexsy) + enum (_Genericsy,_Imaginarysy,_Noreturnsy,_Static_assertsy,_Thread_localsy) enum (autosy,asmsy,breaksy,casesy,charsy) enum (continuesy,constsy,compsy,defaultsy,dosy) enum (doublesy,elsesy,enumsy,externsy,extendedsy) enum (floatsy,forsy,gotosy,ifsy,intsy) - enum (inlinesy,longsy,pascalsy,registersy,returnsy) - enum (shortsy,sizeofsy,staticsy,structsy,switchsy) - enum (segmentsy,signedsy,typedefsy,unionsy,unsignedsy) - enum (voidsy,volatilesy,whilesy,succwhilesy) + enum (inlinesy,longsy,pascalsy,registersy,restrictsy) + enum (returnsy,shortsy,sizeofsy,staticsy,structsy) + enum (switchsy,segmentsy,signedsy,typedefsy,unionsy) + enum (unsignedsy,voidsy,volatilesy,whilesy,succwhilesy) + dc i'_Alignassy,autosy' dc i'autosy,breaksy,casesy,defaultsy,elsesy,floatsy' dc i'gotosy,ifsy,ifsy,longsy,longsy,longsy' dc i'pascalsy,pascalsy,pascalsy,pascalsy,registersy,registersy' diff --git a/Table.macros b/Table.macros index 929820f..659048f 100644 --- a/Table.macros +++ b/Table.macros @@ -17,8 +17,8 @@ MEND MACRO -&LAB STR8 &STR +&LAB STR14 &STR &LAB DC I1'L:A&SYSCNT' A&SYSCNT DC C'&STR' - DS 8-L:A&SYSCNT + DS 14-L:A&SYSCNT MEND diff --git a/Table.pas b/Table.pas index fe6b64a..77418ea 100644 --- a/Table.pas +++ b/Table.pas @@ -20,8 +20,8 @@ var {----------------} charKinds: array[minChar..maxChar] of charEnum; {character kinds} charSym: array[minChar..maxChar] of tokenEnum; {symbols for single char symbols} - reservedWords: array[autosy..whilesy] of string[8]; {reserved word strings} - wordHash: array[0..23] of tokenEnum; {for hashing reserved words} + reservedWords: array[_Alignassy..whilesy] of string[14]; {reserved word strings} + wordHash: array[0..25] of tokenEnum; {for hashing reserved words} {from ASM.PAS} {------------}