Skip to content

Commit 88adbbc

Browse files
committed
ansi-c: introduce conditional_keyword(c, t)
This introduces a helper function in the C scanner to deal with a larger number of cases to enable or disable keywords of the various C/C++ dialects.
1 parent 10a14c9 commit 88adbbc

File tree

1 file changed

+71
-82
lines changed

1 file changed

+71
-82
lines changed

src/ansi-c/scanner.l

+71-82
Original file line numberDiff line numberDiff line change
@@ -149,26 +149,15 @@ int MSC_Keyword(int token)
149149
return make_identifier();
150150
}
151151

152-
int cpp98_keyword(int token)
152+
int conditional_keyword(bool condition, int token)
153153
{
154-
if(PARSER.cpp98)
154+
if(condition)
155155
{
156156
loc();
157157
return token;
158158
}
159159
else
160-
return make_identifier();
161-
}
162-
163-
int cpp11_keyword(int token)
164-
{
165-
if(PARSER.cpp11)
166-
{
167-
loc();
168-
return token;
169-
}
170-
else
171-
return make_identifier();
160+
return make_identifier();
172161
}
173162

174163
int MSC_cpp_keyword(int token)
@@ -843,47 +832,47 @@ enable_or_disable ("enable"|"disable")
843832
/* C++ Keywords and Operators */
844833
%}
845834

846-
alignas { return cpp11_keyword(TOK_ALIGNAS); } // C++11
847-
alignof { return cpp11_keyword(TOK_ALIGNOF); } // C++11
848-
and { return cpp98_keyword(TOK_ANDAND); }
849-
and_eq { return cpp98_keyword(TOK_ANDASSIGN); }
850-
bool { return cpp98_keyword(TOK_BOOL); }
851-
catch { return cpp98_keyword(TOK_CATCH); }
835+
alignas { return conditional_keyword(PARSER.cpp11, TOK_ALIGNAS); } // C++11
836+
alignof { return conditional_keyword(PARSER.cpp11, TOK_ALIGNOF); } // C++11
837+
and { return conditional_keyword(PARSER.cpp98, TOK_ANDAND); }
838+
and_eq { return conditional_keyword(PARSER.cpp98, TOK_ANDASSIGN); }
839+
bool { return conditional_keyword(PARSER.cpp98, TOK_BOOL); }
840+
catch { return conditional_keyword(PARSER.cpp98, TOK_CATCH); }
852841
char16_t { // C++11, but Visual Studio uses typedefs
853842
if(PARSER.mode == configt::ansi_ct::flavourt::VISUAL_STUDIO)
854843
return make_identifier();
855844
else
856-
return cpp11_keyword(TOK_CHAR16_T);
845+
return conditional_keyword(PARSER.cpp11, TOK_CHAR16_T);
857846
}
858847
char32_t { // C++11, but Visual Studio uses typedefs
859848
if(PARSER.mode == configt::ansi_ct::flavourt::VISUAL_STUDIO)
860849
return make_identifier();
861850
else
862-
return cpp11_keyword(TOK_CHAR32_T);
851+
return conditional_keyword(PARSER.cpp11, TOK_CHAR32_T);
863852
}
864-
class { return cpp98_keyword(TOK_CLASS); }
865-
compl { return cpp98_keyword('~'); }
866-
constexpr { return cpp11_keyword(TOK_CONSTEXPR); } // C++11
867-
delete { return cpp98_keyword(TOK_DELETE); }
868-
decltype { return cpp11_keyword(TOK_DECLTYPE); } // C++11
869-
explicit { return cpp98_keyword(TOK_EXPLICIT); }
870-
false { return cpp98_keyword(TOK_FALSE); }
871-
friend { return cpp98_keyword(TOK_FRIEND); }
872-
mutable { return cpp98_keyword(TOK_MUTABLE); }
873-
namespace { return cpp98_keyword(TOK_NAMESPACE); }
874-
new { return cpp98_keyword(TOK_NEW); }
875-
nodiscard { return cpp11_keyword(TOK_NODISCARD); } // C++11
876-
noexcept { return cpp11_keyword(TOK_NOEXCEPT); } // C++11
877-
noreturn { return cpp11_keyword(TOK_NORETURN); } // C++11
878-
not { return cpp98_keyword('!'); }
879-
not_eq { return cpp98_keyword(TOK_NE); }
880-
nullptr { return cpp11_keyword(TOK_NULLPTR); } // C++11
881-
operator { return cpp98_keyword(TOK_OPERATOR); }
882-
or { return cpp98_keyword(TOK_OROR); }
883-
or_eq { return cpp98_keyword(TOK_ORASSIGN); }
884-
private { return cpp98_keyword(TOK_PRIVATE); }
885-
protected { return cpp98_keyword(TOK_PROTECTED); }
886-
public { return cpp98_keyword(TOK_PUBLIC); }
853+
class { return conditional_keyword(PARSER.cpp98, TOK_CLASS); }
854+
compl { return conditional_keyword(PARSER.cpp98, '~'); }
855+
constexpr { return conditional_keyword(PARSER.cpp11, TOK_CONSTEXPR); } // C++11
856+
delete { return conditional_keyword(PARSER.cpp98, TOK_DELETE); }
857+
decltype { return conditional_keyword(PARSER.cpp11, TOK_DECLTYPE); } // C++11
858+
explicit { return conditional_keyword(PARSER.cpp98, TOK_EXPLICIT); }
859+
false { return conditional_keyword(PARSER.cpp98, TOK_FALSE); }
860+
friend { return conditional_keyword(PARSER.cpp98, TOK_FRIEND); }
861+
mutable { return conditional_keyword(PARSER.cpp98, TOK_MUTABLE); }
862+
namespace { return conditional_keyword(PARSER.cpp98, TOK_NAMESPACE); }
863+
new { return conditional_keyword(PARSER.cpp98, TOK_NEW); }
864+
nodiscard { return conditional_keyword(PARSER.cpp11, TOK_NODISCARD); } // C++11
865+
noexcept { return conditional_keyword(PARSER.cpp11, TOK_NOEXCEPT); } // C++11
866+
noreturn { return conditional_keyword(PARSER.cpp11, TOK_NORETURN); } // C++11
867+
not { return conditional_keyword(PARSER.cpp98, '!'); }
868+
not_eq { return conditional_keyword(PARSER.cpp98, TOK_NE); }
869+
nullptr { return conditional_keyword(PARSER.cpp11, TOK_NULLPTR); } // C++11
870+
operator { return conditional_keyword(PARSER.cpp98, TOK_OPERATOR); }
871+
or { return conditional_keyword(PARSER.cpp98, TOK_OROR); }
872+
or_eq { return conditional_keyword(PARSER.cpp98, TOK_ORASSIGN); }
873+
private { return conditional_keyword(PARSER.cpp98, TOK_PRIVATE); }
874+
protected { return conditional_keyword(PARSER.cpp98, TOK_PROTECTED); }
875+
public { return conditional_keyword(PARSER.cpp98, TOK_PUBLIC); }
887876
static_assert { // C++11, but Visual Studio supports it in all modes
888877
// as a keyword, even though the documentation claims
889878
// it's a macro.
@@ -892,26 +881,26 @@ static_assert { // C++11, but Visual Studio supports it in all modes
892881
loc(); return TOK_STATIC_ASSERT;
893882
}
894883
else
895-
return cpp11_keyword(TOK_STATIC_ASSERT);
884+
return conditional_keyword(PARSER.cpp11, TOK_STATIC_ASSERT);
896885
}
897-
template { return cpp98_keyword(TOK_TEMPLATE); }
898-
this { return cpp98_keyword(TOK_THIS); }
899-
thread_local { return cpp11_keyword(TOK_THREAD_LOCAL); } // C++11
900-
throw { return cpp98_keyword(TOK_THROW); }
901-
true { return cpp98_keyword(TOK_TRUE); }
902-
typeid { return cpp98_keyword(TOK_TYPEID); }
903-
typename { return cpp98_keyword(TOK_TYPENAME); }
904-
using { return cpp98_keyword(TOK_USING); }
905-
virtual { return cpp98_keyword(TOK_VIRTUAL); }
886+
template { return conditional_keyword(PARSER.cpp98, TOK_TEMPLATE); }
887+
this { return conditional_keyword(PARSER.cpp98, TOK_THIS); }
888+
thread_local { return conditional_keyword(PARSER.cpp11, TOK_THREAD_LOCAL); } // C++11
889+
throw { return conditional_keyword(PARSER.cpp98, TOK_THROW); }
890+
true { return conditional_keyword(PARSER.cpp98, TOK_TRUE); }
891+
typeid { return conditional_keyword(PARSER.cpp98, TOK_TYPEID); }
892+
typename { return conditional_keyword(PARSER.cpp98, TOK_TYPENAME); }
893+
using { return conditional_keyword(PARSER.cpp98, TOK_USING); }
894+
virtual { return conditional_keyword(PARSER.cpp98, TOK_VIRTUAL); }
906895
wchar_t { // CodeWarrior doesn't have wchar_t built in,
907896
// and MSC has a command-line option to turn it off
908897
if(PARSER.mode==configt::ansi_ct::flavourt::CODEWARRIOR)
909898
return make_identifier();
910899
else
911-
return cpp98_keyword(TOK_WCHAR_T);
900+
return conditional_keyword(PARSER.cpp98, TOK_WCHAR_T);
912901
}
913-
xor { return cpp98_keyword('^'); }
914-
xor_eq { return cpp98_keyword(TOK_XORASSIGN); }
902+
xor { return conditional_keyword(PARSER.cpp98, '^'); }
903+
xor_eq { return conditional_keyword(PARSER.cpp98, TOK_XORASSIGN); }
915904
".*" { return cpp_operator(TOK_DOTPM); }
916905
"->*" { return cpp_operator(TOK_ARROWPM); }
917906
"::" { if(PARSER.cpp98)
@@ -928,7 +917,7 @@ xor_eq { return cpp98_keyword(TOK_XORASSIGN); }
928917
__decltype { if(PARSER.cpp98 &&
929918
(PARSER.mode==configt::ansi_ct::flavourt::GCC ||
930919
PARSER.mode==configt::ansi_ct::flavourt::CLANG))
931-
return cpp98_keyword(TOK_DECLTYPE);
920+
return conditional_keyword(PARSER.cpp98, TOK_DECLTYPE);
932921
else
933922
return make_identifier();
934923
}
@@ -943,35 +932,35 @@ __decltype { if(PARSER.cpp98 &&
943932
"__has_assign" { loc(); return MSC_cpp_keyword(TOK_UNARY_TYPE_PREDICATE); }
944933
"__has_copy" { loc(); return MSC_cpp_keyword(TOK_UNARY_TYPE_PREDICATE); }
945934
"__has_finalizer" { loc(); return MSC_cpp_keyword(TOK_UNARY_TYPE_PREDICATE); }
946-
"__has_nothrow_assign" { loc(); return cpp98_keyword(TOK_UNARY_TYPE_PREDICATE); }
947-
"__has_nothrow_constructor" { loc(); return cpp98_keyword(TOK_UNARY_TYPE_PREDICATE); }
948-
"__has_nothrow_copy" { loc(); return cpp98_keyword(TOK_UNARY_TYPE_PREDICATE); }
949-
"__has_trivial_assign" { loc(); return cpp98_keyword(TOK_UNARY_TYPE_PREDICATE); }
950-
"__has_trivial_constructor" { loc(); return cpp98_keyword(TOK_UNARY_TYPE_PREDICATE); }
951-
"__has_trivial_copy" { loc(); return cpp98_keyword(TOK_UNARY_TYPE_PREDICATE); }
952-
"__has_trivial_destructor" { loc(); return cpp98_keyword(TOK_UNARY_TYPE_PREDICATE); }
935+
"__has_nothrow_assign" { loc(); return conditional_keyword(PARSER.cpp98, TOK_UNARY_TYPE_PREDICATE); }
936+
"__has_nothrow_constructor" { loc(); return conditional_keyword(PARSER.cpp98, TOK_UNARY_TYPE_PREDICATE); }
937+
"__has_nothrow_copy" { loc(); return conditional_keyword(PARSER.cpp98, TOK_UNARY_TYPE_PREDICATE); }
938+
"__has_trivial_assign" { loc(); return conditional_keyword(PARSER.cpp98, TOK_UNARY_TYPE_PREDICATE); }
939+
"__has_trivial_constructor" { loc(); return conditional_keyword(PARSER.cpp98, TOK_UNARY_TYPE_PREDICATE); }
940+
"__has_trivial_copy" { loc(); return conditional_keyword(PARSER.cpp98, TOK_UNARY_TYPE_PREDICATE); }
941+
"__has_trivial_destructor" { loc(); return conditional_keyword(PARSER.cpp98, TOK_UNARY_TYPE_PREDICATE); }
953942
"__has_user_destructor" { loc(); return MSC_cpp_keyword(TOK_UNARY_TYPE_PREDICATE); }
954-
"__has_virtual_destructor" { loc(); return cpp98_keyword(TOK_UNARY_TYPE_PREDICATE); }
955-
"__is_abstract" { loc(); return cpp98_keyword(TOK_UNARY_TYPE_PREDICATE); }
956-
"__is_base_of" { loc(); return cpp98_keyword(TOK_BINARY_TYPE_PREDICATE); }
957-
"__is_class" { loc(); return cpp98_keyword(TOK_UNARY_TYPE_PREDICATE); }
958-
"__is_convertible_to" { loc(); return cpp98_keyword(TOK_BINARY_TYPE_PREDICATE); }
943+
"__has_virtual_destructor" { loc(); return conditional_keyword(PARSER.cpp98, TOK_UNARY_TYPE_PREDICATE); }
944+
"__is_abstract" { loc(); return conditional_keyword(PARSER.cpp98, TOK_UNARY_TYPE_PREDICATE); }
945+
"__is_base_of" { loc(); return conditional_keyword(PARSER.cpp98, TOK_BINARY_TYPE_PREDICATE); }
946+
"__is_class" { loc(); return conditional_keyword(PARSER.cpp98, TOK_UNARY_TYPE_PREDICATE); }
947+
"__is_convertible_to" { loc(); return conditional_keyword(PARSER.cpp98, TOK_BINARY_TYPE_PREDICATE); }
959948
"__is_delegate" { loc(); return MSC_cpp_keyword(TOK_UNARY_TYPE_PREDICATE); }
960-
"__is_empty" { loc(); return cpp98_keyword(TOK_UNARY_TYPE_PREDICATE); }
961-
"__is_enum" { loc(); return cpp98_keyword(TOK_UNARY_TYPE_PREDICATE); }
962-
"__is_interface_class" { loc(); return cpp98_keyword(TOK_UNARY_TYPE_PREDICATE); }
963-
"__is_pod" { loc(); return cpp98_keyword(TOK_UNARY_TYPE_PREDICATE); }
964-
"__is_polymorphic" { loc(); return cpp98_keyword(TOK_UNARY_TYPE_PREDICATE); }
949+
"__is_empty" { loc(); return conditional_keyword(PARSER.cpp98, TOK_UNARY_TYPE_PREDICATE); }
950+
"__is_enum" { loc(); return conditional_keyword(PARSER.cpp98, TOK_UNARY_TYPE_PREDICATE); }
951+
"__is_interface_class" { loc(); return conditional_keyword(PARSER.cpp98, TOK_UNARY_TYPE_PREDICATE); }
952+
"__is_pod" { loc(); return conditional_keyword(PARSER.cpp98, TOK_UNARY_TYPE_PREDICATE); }
953+
"__is_polymorphic" { loc(); return conditional_keyword(PARSER.cpp98, TOK_UNARY_TYPE_PREDICATE); }
965954
"__is_ref_array" { loc(); return MSC_cpp_keyword(TOK_UNARY_TYPE_PREDICATE); }
966955
"__is_ref_class" { loc(); return MSC_cpp_keyword(TOK_UNARY_TYPE_PREDICATE); }
967956
"__is_sealed" { loc(); return MSC_cpp_keyword(TOK_UNARY_TYPE_PREDICATE); }
968957
"__is_simple_value_class" { loc(); return MSC_cpp_keyword(TOK_UNARY_TYPE_PREDICATE); }
969-
"__is_union" { loc(); return cpp98_keyword(TOK_UNARY_TYPE_PREDICATE); }
958+
"__is_union" { loc(); return conditional_keyword(PARSER.cpp98, TOK_UNARY_TYPE_PREDICATE); }
970959
"__is_value_class" { loc(); return MSC_cpp_keyword(TOK_UNARY_TYPE_PREDICATE); }
971960

972961
"__if_exists" { loc(); return MSC_cpp_keyword(TOK_MSC_IF_EXISTS); }
973962
"__if_not_exists" { loc(); return MSC_cpp_keyword(TOK_MSC_IF_NOT_EXISTS); }
974-
"__underlying_type" { loc(); return cpp98_keyword(TOK_UNDERLYING_TYPE); }
963+
"__underlying_type" { loc(); return conditional_keyword(PARSER.cpp98, TOK_UNDERLYING_TYPE); }
975964

976965
"["{ws}"repeatable" |
977966
"["{ws}"source_annotation_attribute" |
@@ -996,28 +985,28 @@ __decltype { if(PARSER.cpp98 &&
996985

997986
"__char16_t" { if(PARSER.mode==configt::ansi_ct::flavourt::GCC ||
998987
PARSER.mode==configt::ansi_ct::flavourt::CLANG)
999-
return cpp98_keyword(TOK_CHAR16_T); // GNU extension
988+
return conditional_keyword(PARSER.cpp98, TOK_CHAR16_T); // GNU extension
1000989
else
1001990
return make_identifier();
1002991
}
1003992

1004993
"__nullptr" { if(PARSER.mode==configt::ansi_ct::flavourt::GCC ||
1005994
PARSER.mode==configt::ansi_ct::flavourt::CLANG)
1006-
return cpp98_keyword(TOK_NULLPTR); // GNU extension
995+
return conditional_keyword(PARSER.cpp98, TOK_NULLPTR); // GNU extension
1007996
else
1008997
return make_identifier();
1009998
}
1010999

10111000
"__null" { if(PARSER.mode==configt::ansi_ct::flavourt::GCC ||
10121001
PARSER.mode==configt::ansi_ct::flavourt::CLANG)
1013-
return cpp98_keyword(TOK_NULLPTR); // GNU extension
1002+
return conditional_keyword(PARSER.cpp98, TOK_NULLPTR); // GNU extension
10141003
else
10151004
return make_identifier();
10161005
}
10171006

10181007
"__char32_t" { if(PARSER.mode==configt::ansi_ct::flavourt::GCC ||
10191008
PARSER.mode==configt::ansi_ct::flavourt::CLANG)
1020-
return cpp98_keyword(TOK_CHAR32_T); // GNU extension
1009+
return conditional_keyword(PARSER.cpp98, TOK_CHAR32_T); // GNU extension
10211010
else
10221011
return make_identifier();
10231012
}

0 commit comments

Comments
 (0)