22%option never-interactive
23%option prefix="pyscannerYY"
25%option extra-type="struct pyscannerYY_state *"
29#define YY_TYPEDEF_YY_SCANNER_T
65#define DBG_CTX(x) do { } while(0)
68#define YY_NO_UNISTD_H 1
70#define unput_string(yytext,yyleng) do { for (int i=(int)yyleng-1;i>=0;i--) unput(yytext[i]); } while(0)
160#define YY_INPUT(buf,result,max_size) result=yyread(yyscanner,buf,max_size);
Abstract interface for outline parsers.
This is an alternative implementation of QCString.
Text streaming class that buffers data.
std::unordered_map< std::string, std::string > StringUnorderedMap
#define lineCount(s, len)
static void newEntry(yyscan_t yyscanner)
static void incLineNr(yyscan_t yyscanner)
static void docVariable(yyscan_t yyscanner, const char *s)
static void initSpecialBlock(yyscan_t yyscanner)
static void initTriSingleQuoteBlock(yyscan_t yyscanner)
static int computeIndent(const char *s)
static void addFrom(yyscan_t yyscanner, bool all)
static void setProtection(yyscan_t yyscanner)
static void initParser(yyscan_t yyscanner)
static void endOfDef(yyscan_t yyscanner, int correction=0)
static QCString findPackageScope(yyscan_t yyscanner, const QCString &fileName)
static int yyread(yyscan_t yyscanner, char *buf, int max_size)
static void searchFoundClass(yyscan_t yyscanner)
static const char * stateToString(int state)
static QCString findPackageScopeFromPath(yyscan_t yyscanner, const QCString &path)
static void newVariable(yyscan_t yyscanner)
static void initTriDoubleQuoteBlock(yyscan_t yyscanner)
static void handleCommentBlock(yyscan_t yyscanner, const QCString &doc, bool brief)
static void searchFoundDef(yyscan_t yyscanner)
static void addEntry(yyscan_t yyscanner)
static const char * getLexerFILE()
static void startCommentBlock(yyscan_t yyscanner, bool brief)
static void newFunction(yyscan_t yyscanner)
static void addVariable(yyscan_t yyscanner)
static void addToString(yyscan_t yyscanner, const char *s)
static void initEntry(yyscan_t yyscanner)
Some helper functions for std::string.
std::shared_ptr< Entry > previous
std::shared_ptr< Entry > current
StringUnorderedMap packageNameCache
std::shared_ptr< Entry > bodyEntry
TextStream decoratorCommentStr
std::shared_ptr< Entry > current_root
bool packageCommentAllowed
OutlineParserInterface * thisParser
std::vector< QCString > decorators
CommentScanner commentScanner
MethodTypes
Kind of method.
Protection
Protection level of members.
Specifier
Virtualness of a member.
A bunch of utility functions.
177HEXNUMBER "0"[xX][0-9a-fA-F]+[lL]?
178OCTNUMBER "0"[0-7]+[lL]?
179NUMBER {DIGIT}+[lLjJ]?
180INTNUMBER {HEXNUMBER}|{OCTNUMBER}|{NUMBER}
181FLOATNUMBER {DIGIT}+"."{DIGIT}+([eE][+\-]?{DIGIT}+)?[jJ]?
183LETTER [A-Za-z\x80-\xFF]
184NONEMPTY [A-Za-z0-9_\x80-\xFF]
185EXPCHAR [#(){}\[\],:.%/\\=`*~|&<>!;+-]
186PARAMNONEMPTY [^ \t\n():]
187IDENTIFIER ({LETTER}|"_")({LETTER}|{DIGIT}|"_")*
188SCOPE {IDENTIFIER}("."{IDENTIFIER})*
190TRISINGLEQUOTE {STRINGPREFIX}?"'''"(!)?
191TRIDOUBLEQUOTE {STRINGPREFIX}?"\"\"\""(!)?
192ENDTRISINGLEQUOTE "'''"
193ENDTRIDOUBLEQUOTE "\"\"\""
194LONGSTRINGCHAR [^\\"']
196LONGSTRINGITEM ({LONGSTRINGCHAR}|{ESCAPESEQ})
197SMALLQUOTE ("\"\""|"\""|"'"|"''")
198LONGSTRINGBLOCK ({LONGSTRINGITEM}|{SMALLQUOTE})
200STRINGPREFIX ("r"|"u"|"ur"|"R"|"U"|"UR"|"Ur"|"uR")
201POUNDCOMMENT "#"[^#\n][^\n]*
206LINENR {B}*[1-9][0-9]*
207FILEICHAR [a-z_A-Z0-9\x80-\xFF\\:\\\/\-\+=&#@]
208FILEECHAR [a-z_A-Z0-9\x80-\xFF\-\+=&#@]
209FILECHARS {FILEICHAR}*{FILEECHAR}+
210HFILEMASK {FILEICHAR}*("."{FILEICHAR}+)+{FILECHARS}*
211VFILEMASK {FILECHARS}("."{FILECHARS})*
212FILEMASK {VFILEMASK}|{HFILEMASK}
215ID [a-z_A-Z%]+{IDSYM}*
238%x FunctionTypeAnnotation
239%x FunctionParamDefVal
258%x SingleQuoteStringIgnore
259%x DoubleQuoteStringIgnore
279 DBG_CTX((stderr,
"Found def at %d\n",yyextra->yyLineNr));
282 BEGIN( FunctionDec );
284 ^{B}"async"{BB}"def"{BB} {
285 DBG_CTX((stderr,
"Found async def at %d\n",yyextra->yyLineNr));
288 BEGIN( FunctionDec );
292 BEGIN( FunctionDec );
294 "async"{BB}"def"{BB} {
296 BEGIN( FunctionDec );
300 DBG_CTX((stderr,
"Found class at %d\n",yyextra->yyLineNr));
311 yyextra->packageCommentAllowed =
FALSE;
317 yyextra->packageCommentAllowed =
FALSE;
320 ^{B}{IDENTIFIER}/{B}"="{B}"property" {
321 yyextra->current->section = EntryType::makeVariable();
324 yyextra->current->fileName = yyextra->fileName;
325 yyextra->current->startLine = yyextra->yyLineNr;
326 yyextra->current->bodyLine = yyextra->yyLineNr;
327 yyextra->packageCommentAllowed =
FALSE;
QCString stripWhiteSpace() const
returns a copy of this string with leading and trailing whitespace removed
330 ^{B}{IDENTIFIER}/{B}"="[^=] {
331 if (yyextra->searchCount>0) REJECT;
333 yyextra->current->section = EntryType::makeVariable();
335 yyextra->current->fileName = yyextra->fileName;
336 yyextra->current->startLine = yyextra->yyLineNr;
337 yyextra->current->bodyLine = yyextra->yyLineNr;
338 yyextra->packageCommentAllowed =
FALSE;
341 ^{B}{IDENTIFIER}/{B}":" {
342 if (yyextra->searchCount>0) REJECT;
344 if (
id ==
"try" ||
id ==
"else" ||
id ==
"except" ||
id ==
"finally") REJECT;
346 yyextra->current->section = EntryType::makeVariable();
347 yyextra->current->name = id;
348 yyextra->current->fileName = yyextra->fileName;
349 yyextra->current->startLine = yyextra->yyLineNr;
350 yyextra->current->bodyLine = yyextra->yyLineNr;
351 yyextra->packageCommentAllowed =
FALSE;
354 {B}{IDENTIFIER}/({B},{B}{IDENTIFIER})*{B}")"*{B}"="[^=] {
358 if (yyextra->searchCount>1) REJECT;
360 yyextra->current->section = EntryType::makeVariable();
362 yyextra->current->fileName = yyextra->fileName;
363 yyextra->current->startLine = yyextra->yyLineNr;
364 yyextra->current->bodyLine = yyextra->yyLineNr;
365 yyextra->packageCommentAllowed =
FALSE;
static void addVariable(yyscan_t yyscanner, QCString type, QCString name)
369 yyextra->stringContext=YY_START;
370 yyextra->copyString=
nullptr;
371 yyextra->packageCommentAllowed =
FALSE;
372 BEGIN( SingleQuoteString );
375 yyextra->stringContext=YY_START;
376 yyextra->copyString=
nullptr;
377 yyextra->packageCommentAllowed =
FALSE;
378 BEGIN( DoubleQuoteString );
381 yyextra->isStatic=
TRUE;
385 yyextra->decoratorRound = 1;
386 yyextra->copyString=
nullptr;
393 if (yyextra->yyLineNr != 1) REJECT;
400 yyextra->packageCommentAllowed =
FALSE;
412 BEGIN(TripleComment);
417 BEGIN(TripleComment);
420 {B}{STARTDOCSYMS}/[^#] {
422 yyextra->packageCommentAllowed =
FALSE;
424 BEGIN(SpecialComment);
427 yyextra->searchCount++;
430 if (yyextra->searchCount>0)
432 yyextra->searchCount--;
436 yyextra->current->doc.clear();
437 yyextra->current->brief.clear();
451 {IDENTIFIER}({B}"."{B}{IDENTIFIER})* {
452 yyextra->packageName=yytext;
474 {IDENTIFIER}/{B}","{B} {
477 {IDENTIFIER}/{B}")" {
482 if (!yyextra->importTuple)
489 if (!yyextra->importTuple)
497 yyextra->importTuple=
TRUE;
500 yyextra->importTuple=
FALSE;
515 {IDENTIFIER}({B}"."{B}{IDENTIFIER})* {
517 yyextra->current->fileName = yyextra->fileName;
519 yyextra->current->section=EntryType::makeUsingDecl();
520 yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
static void initEntry(yyscan_t yyscanner)
QCString substitute(const QCString &s, const QCString &src, const QCString &dst)
substitute all occurrences of src in s by dst
QCString removeRedundantWhiteSpace(const QCString &s)
537 ("cls"|"self")"."{IDENTIFIER}/{B}[,)] {
538 const char *s = strchr(yytext,
'.'); s++;
539 DBG_CTX((stderr,
"Found instance method variable %s in %s at %d\n",s,
qPrint(yyextra->current_root->name.data(),yyextra->yyLineNr)));
const char * qPrint(const char *s)
543 ("cls"|"self")"."{IDENTIFIER}/{B}"=" {
544 const char *s = strchr(yytext,
'.'); s++;
545 DBG_CTX((stderr,
"Found instance method variable %s in %s at %d\n",s,
qPrint(yyextra->current_root->name.data(),yyextra->yyLineNr)));
547 BEGIN( SearchSkipValue );
549 ("cls"|"self")"."{IDENTIFIER}/{B}":" {
550 const char *s = strchr(yytext,
'.'); s++;
551 DBG_CTX((stderr,
"Found instance method variable %s in %s at %d\n",s,
qPrint(yyextra->current_root->name.data(),yyextra->yyLineNr)));
557 BEGIN(TripleComment);
562 BEGIN(TripleComment);
565 {STARTDOCSYMS}/[^#] {
567 BEGIN(SpecialComment);
572 yyextra->stringContext=YY_START;
573 yyextra->copyString=
nullptr;
574 BEGIN( SingleQuoteString );
577 yyextra->stringContext=YY_START;
578 yyextra->copyString=
nullptr;
579 BEGIN( DoubleQuoteString );
583 yyextra->current->doc.clear();
584 yyextra->current->brief.clear();
586 BEGIN( SearchSkipValue );
595 yyextra->braceCount=0;
598 yyextra->current->type+=*yytext;
599 yyextra->braceCount++;
602 yyextra->current->type+=*yytext;
603 yyextra->braceCount--;
606 yyextra->stringContext=YY_START;
607 yyextra->copyString=
nullptr;
608 BEGIN( SingleQuoteString );
611 yyextra->stringContext=YY_START;
612 yyextra->copyString=
nullptr;
613 BEGIN( DoubleQuoteString );
616 if (yyextra->braceCount==0)
618 yyextra->current->type = yyextra->current->type.stripWhiteSpace();
620 BEGIN(SearchSkipValue);
624 yyextra->current->type+=*yytext;
628 yyextra->current->type = yyextra->current->type.stripWhiteSpace();
631 BEGIN(SearchMemVars);
634 yyextra->current->type+=
' ';
638 yyextra->current->type+=*yytext;
642<SearchSkipValue,VariableDec>{
645 yyextra->startInit =
TRUE;
646 yyextra->current->initializer.str(yytext);
647 yyextra->current->initializer <<
" ";
650 yyextra->current->initializer << yytext;
654 if (yyextra->current->type.isEmpty()) yyextra->current->type =
"int";
655 yyextra->current->initializer << yytext;
658 if (yyextra->current->type.isEmpty()) yyextra->current->type =
"float";
659 yyextra->current->initializer << yytext;
662 if (yyextra->current->type.isEmpty()) yyextra->current->type =
"bool";
663 yyextra->current->initializer << yytext;
666 if (yyextra->current->type.isEmpty()) yyextra->current->type =
"str";
667 yyextra->current->initializer << yytext;
668 yyextra->copyString=&yyextra->current->initializer;
669 yyextra->stringContext=YY_START;
670 BEGIN( SingleQuoteString );
672 {STRINGPREFIX}?"\"" {
673 if (yyextra->current->type.isEmpty()) yyextra->current->type =
"str";
674 yyextra->current->initializer << yytext;
675 yyextra->copyString=&yyextra->current->initializer;
676 yyextra->stringContext=YY_START;
677 BEGIN( DoubleQuoteString );
680 if (yyextra->current->type.isEmpty()) yyextra->current->type =
"str";
681 yyextra->current->initializer << yytext;
682 yyextra->doubleQuote=
TRUE;
683 yyextra->copyString=&yyextra->current->initializer;
684 yyextra->stringContext=YY_START;
689 if (yyextra->current->type.isEmpty()) yyextra->current->type =
"str";
690 yyextra->current->initializer << yytext;
691 yyextra->doubleQuote=
FALSE;
692 yyextra->copyString=&yyextra->current->initializer;
693 yyextra->stringContext=YY_START;
699 yyextra->current->type =
"tuple";
701 yyextra->current->initializer << *yytext;
702 yyextra->atomStart=
'(';
703 yyextra->atomEnd=
')';
704 yyextra->atomCount=1;
705 yyextra->atomContext=YY_START;
706 BEGIN( VariableAtom );
709 if (yyextra->startInit) yyextra->current->type =
"list";
710 yyextra->current->initializer << *yytext;
711 yyextra->atomStart=
'[';
712 yyextra->atomEnd=
']';
713 yyextra->atomCount=1;
714 yyextra->atomContext=YY_START;
715 BEGIN( VariableAtom );
718 if (yyextra->startInit) yyextra->current->type =
"dict";
719 yyextra->current->initializer << *yytext;
720 yyextra->atomStart=
'{';
721 yyextra->atomEnd=
'}';
722 yyextra->atomCount=1;
723 yyextra->atomContext=YY_START;
724 BEGIN( VariableAtom );
727 yyextra->current->initializer << yytext;
732 if (yyextra->current->type.isEmpty())
734 for (
const auto &child : yyextra->current_root->children())
736 if (child->name ==
QCString(yytext))
738 yyextra->current->type = child->type;
743 yyextra->startInit =
FALSE;
744 yyextra->current->initializer << yytext;
747 yyextra->startInit =
FALSE;
748 yyextra->current->initializer << *yytext;
752 {STARTDOCSYMS}/[^#] {
754 BEGIN(SpecialComment);
760 BEGIN(SearchMemVars);
765 \n{B}/{IDENTIFIER}[^{LETTER}{DIGIT}_] {
777 yyextra->current->program << yytext;
791 yyextra->current->program << yytext;
799 yyextra->current->program << yytext;
802 yyextra->current->program << yytext;
804 if (yyextra->curIndent<=yyextra->indent)
812 yyextra->current->program << yytext;
813 yyextra->stringContext=YY_START;
814 yyextra->specialBlock =
FALSE;
815 yyextra->copyString=&yyextra->current->program;
816 BEGIN( SingleQuoteString );
819 yyextra->current->program << yytext;
820 yyextra->stringContext=YY_START;
821 yyextra->specialBlock =
FALSE;
822 yyextra->copyString=&yyextra->current->program;
823 BEGIN( DoubleQuoteString );
826 yyextra->current->program << yytext;
827 yyextra->specialBlock =
FALSE;
830 yyextra->current->program << yytext;
833 yyextra->current->program << yytext;
837 yyextra->current->program << yytext;
840 yyextra->current->program << *yytext;
841 yyextra->specialBlock =
FALSE;
845 yyextra->current->program << yytext;
847 BEGIN(TripleComment);
851 yyextra->current->program << yytext;
853 BEGIN(TripleComment);
861 yyextra->current->name = yytext;
862 yyextra->current->name = yyextra->current->name.stripWhiteSpace();
866 yyextra->specialBlock =
TRUE;
867 yyextra->bodyEntry = yyextra->current;
868 yyextra->current->bodyLine = yyextra->yyLineNr;
873 yyextra->defVal.str(std::string());
874 yyextra->braceCount = 0;
875 BEGIN(FunctionTypeAnnotation);
878 yyextra->funcParamsEnd =
FALSE;
879 yyextra->current->bodyLine = yyextra->yyLineNr;
880 BEGIN(FunctionParams);
883 if (yyextra->current->argList.empty())
885 yyextra->current->argList.setNoParameters(
TRUE);
888 yyextra->funcParamsEnd =
TRUE;
QCString argListToString(const ArgumentList &al, bool useCanonicalType, bool showDefVals)
897 if (!yyextra->argType.isEmpty())
901 a.
type = yyextra->argType;
902 yyextra->current->argList.push_back(a);
903 yyextra->argType =
"";
This class contains the information about the argument of a function or template.
908 yyextra->argType = yytext;
914 a.
type = yyextra->argType;
915 yyextra->current->argList.push_back(a);
916 yyextra->argType =
"";
921 yyextra->defVal.str(std::string());
922 yyextra->braceCount = 0;
923 BEGIN(FunctionParamDefVal);
926 if (!yyextra->argType.isEmpty())
930 a.
type = yyextra->argType;
931 yyextra->current->argList.push_back(a);
932 yyextra->argType =
"";
938 yyextra->defVal.str(std::string());
939 yyextra->braceCount = 0;
940 BEGIN(FunctionAnnotation);
949<FunctionTypeAnnotation>{
953 ++yyextra->braceCount;
954 yyextra->defVal << *yytext;
959 --yyextra->braceCount;
960 yyextra->defVal << *yytext;
963 if (yyextra->braceCount == 0)
965 yyextra->current->type = yyextra->defVal.str();
970 yyextra->defVal << *yytext;
973 yyextra->defVal << *yytext;
974 yyextra->copyString=&yyextra->defVal;
975 yyextra->stringContext=FunctionTypeAnnotation;
976 BEGIN(SingleQuoteString);
979 yyextra->defVal << *yytext;
980 yyextra->copyString=&yyextra->defVal;
981 yyextra->stringContext=FunctionTypeAnnotation;
982 BEGIN(DoubleQuoteString);
985 yyextra->defVal << *yytext;
989 yyextra->defVal << *yytext;
997 ++yyextra->braceCount;
998 yyextra->defVal << *yytext;
1002 --yyextra->braceCount;
1003 yyextra->defVal << *yytext;
1008 if (yyextra->braceCount == 0)
1010 if (!yyextra->current->argList.empty())
1011 yyextra->current->argList.back().type += yyextra->defVal.str();
1014 BEGIN(FunctionParams);
1019 --yyextra->braceCount;
1020 yyextra->defVal << *yytext;
1024 yyextra->defVal << *yytext;
1025 yyextra->copyString=&yyextra->defVal;
1026 yyextra->stringContext=FunctionAnnotation;
1027 BEGIN(SingleQuoteString);
1030 yyextra->defVal << *yytext;
1031 yyextra->copyString=&yyextra->defVal;
1032 yyextra->stringContext=FunctionAnnotation;
1033 BEGIN(DoubleQuoteString);
1036 yyextra->defVal << *yytext;
1040 yyextra->defVal << *yytext;
1044<FunctionParamDefVal>{
1048 ++yyextra->braceCount;
1049 yyextra->defVal << *yytext;
1053 --yyextra->braceCount;
1054 yyextra->defVal << *yytext;
1058 if (yyextra->braceCount == 0)
1060 if (!yyextra->current->argList.empty())
1064 BEGIN(FunctionParams);
1069 --yyextra->braceCount;
1070 yyextra->defVal << *yytext;
1075 yyextra->defVal << *yytext;
1076 yyextra->copyString=&yyextra->defVal;
1077 yyextra->stringContext=FunctionParamDefVal;
1078 BEGIN( SingleQuoteString );
1081 yyextra->defVal << *yytext;
1082 yyextra->copyString=&yyextra->defVal;
1083 yyextra->stringContext=FunctionParamDefVal;
1084 BEGIN( DoubleQuoteString );
1087 yyextra->defVal << *yytext;
1091 yyextra->defVal << *yytext;
1097 \n/{IDENTIFIER}{BB} {
1101 for (i=(
int)yyleng-1;i>=0;i--)
1112 yyextra->current->program << yytext;
1119 for (i=(
int)yyleng-1;i>=0;i--)
1130 yyextra->current->program << yytext;
1134 yyextra->current->program << yytext;
1142 DBG_CTX((stderr,
"yyextra->curIndent=%d yyextra->indent=%d\n",yyextra->curIndent,yyextra->indent));
1143 if (yyextra->curIndent<=yyextra->indent)
1147 yyextra->indent=yyextra->curIndent;
1155 yyextra->current->program << yytext;
1159 yyextra->current->program << *yytext;
1160 yyextra->stringContext=YY_START;
1161 yyextra->specialBlock =
FALSE;
1162 yyextra->copyString=&yyextra->current->program;
1163 BEGIN( SingleQuoteString );
1166 yyextra->current->program << *yytext;
1167 yyextra->stringContext=YY_START;
1168 yyextra->specialBlock =
FALSE;
1169 yyextra->copyString=&yyextra->current->program;
1170 BEGIN( DoubleQuoteString );
1173 yyextra->current->program << yytext;
1174 yyextra->specialBlock =
FALSE;
1178 yyextra->current->program << *yytext;
1182 yyextra->current->program << yytext;
1185 yyextra->specialBlock =
FALSE;
1186 yyextra->current->program << *yytext;
1190 yyextra->current->program << yytext;
1192 BEGIN(TripleComment);
1197 yyextra->current->program << yytext;
1199 BEGIN(TripleComment);
1203<ClassDec>{IDENTIFIER} {
1204 if (yyextra->current->type.isEmpty())
1206 yyextra->current->type =
"class";
1209 yyextra->current->section = EntryType::makeClass();
1210 yyextra->current->name = yytext;
1215 if (yyextra->current_root->section.isScope())
1218 yyextra->current->name.prepend(yyextra->current_root->name+
"::");
1221 yyextra->current->name = yyextra->current->name.stripWhiteSpace();
1222 yyextra->current->fileName = yyextra->fileName;
1223 yyextra->docBlockContext = YY_START;
1224 yyextra->docBlockInBody =
FALSE;
1225 yyextra->docBlockJavaStyle =
FALSE;
1226 yyextra->docBlock.clear();
1228 BEGIN(ClassInheritance);
1236 yyextra->specialBlock =
TRUE;
1237 yyextra->current->bodyLine = yyextra->yyLineNr;
1238 yyextra->current->program.str(std::string());
1239 BEGIN(ClassCaptureIndent);
1243 yyextra->current->extends.emplace_back(
1249 yyextra->stringContext=YY_START;
1250 BEGIN( SingleQuoteStringIgnore );
1253 yyextra->stringContext=YY_START;
1254 BEGIN( DoubleQuoteStringIgnore );
1258<SingleQuoteStringIgnore>{
1260 BEGIN(yyextra->stringContext);
1264<DoubleQuoteStringIgnore>{
1266 BEGIN(yyextra->stringContext);
1271<ClassCaptureIndent>{
1275 yyextra->current->program << yytext;
1280 yyextra->current->program << yytext;
1281 BEGIN(TripleComment);
1285 yyextra->current->program << yytext;
1286 BEGIN(TripleComment);
1288 {STARTDOCSYMS}[#]* {
1290 BEGIN(SpecialComment);
1295 yyextra->current->program << yytext;
1298 yyextra->bodyEntry = yyextra->current;
1299 DBG_CTX((stderr,
"setting indent %d\n",yyextra->curIndent));
1305 ""/({NONEMPTY}|{EXPCHAR}) {
1309 yyextra->current->program << yytext;
1318 ":"{B}{IDENTIFIER} {
1319 yyextra->startInit =
FALSE;
1320 yyextra->current->type =
substitute(yytext,
":",
"");
1322 {STARTDOCSYMS}"<"/.* {
1324 yyextra->packageCommentAllowed =
FALSE;
1326 yyextra->docBlockContext = VariableEnd;
1327 BEGIN(SpecialComment);
1330 BEGIN( VariableEnd );
1334 BEGIN( VariableEnd );
1340 yyextra->current->initializer << *yytext;
1341 if (yyextra->atomStart==*yytext)
1343 yyextra->atomCount++;
1347 yyextra->current->initializer << *yytext;
1348 if (yyextra->atomEnd==*yytext)
1350 yyextra->atomCount--;
1352 if (yyextra->atomCount==0)
1354 yyextra->startInit =
FALSE;
1355 BEGIN(yyextra->atomContext);
1359 yyextra->specialBlock =
FALSE;
1360 yyextra->current->program << yytext;
1362 BEGIN(TripleComment);
1366 yyextra->specialBlock =
FALSE;
1367 yyextra->current->program << yytext;
1369 BEGIN(TripleComment);
1372 yyextra->stringContext=YY_START;
1373 yyextra->current->initializer <<
"'";
1374 yyextra->copyString=&yyextra->current->initializer;
1375 BEGIN( SingleQuoteString );
1378 yyextra->stringContext=YY_START;
1379 yyextra->current->initializer <<
"\"";
1380 yyextra->copyString=&yyextra->current->initializer;
1381 BEGIN( DoubleQuoteString );
1384 yyextra->current->initializer << yytext;
1387 yyextra->current->initializer << *yytext;
1390 yyextra->current->initializer << *yytext;
std::string_view stripWhiteSpace(std::string_view s)
Given a string view s, returns a new, narrower view on that string, skipping over any leading or trai...
1415 {ENDTRIDOUBLEQUOTE} |
1416 {ENDTRISINGLEQUOTE} {
1418 if (yyextra->doubleQuote==(yytext[0]==
'"'))
1420 if (yyextra->specialBlock)
1422 QCString actualDoc=yyextra->docBlock;
1423 if (!yyextra->docBlockSpecial)
1428 actualDoc.
prepend(
"@iverbatim\n");
1429 actualDoc.
append(
"@endiverbatim ");
1435 else if (yyextra->packageCommentAllowed)
1437 QCString actualDoc=yyextra->docBlock;
1438 if (!yyextra->docBlockSpecial)
1443 actualDoc.
prepend(
"@iverbatim\n");
1444 actualDoc.
append(
"@endiverbatim ");
1447 if (yyextra->moduleScope.startsWith(
"__") && yyextra->moduleScope.endsWith(
"__"))
1449 actualDoc.
prepend(
"\\namespace \\"+yyextra->moduleScope+
" ");
1453 actualDoc.
prepend(
"\\namespace "+yyextra->moduleScope+
" ");
1457 if ((yyextra->docBlockContext==ClassBody ) ||
1458 yyextra->docBlockContext==FunctionBody)
1460 yyextra->current->program << yyextra->docBlock;
1461 yyextra->current->program << yytext;
1468 BEGIN(yyextra->docBlockContext);
1472 yyextra->docBlock += yytext;
1474 yyextra->packageCommentAllowed =
FALSE;
QCString & prepend(const char *s)
bool isEmpty() const
Returns TRUE iff the string is empty.
QCString & append(char c)
static void handleCommentBlock(yyscan_t yyscanner, const QCString &doc, bool brief)
void stripIndentationVerbatim(QCString &doc, const int indentationLevel)
1479 if (yyextra->docBlockSpecial && yyleng >= yyextra->curIndent)
1480 yyextra->docBlock += yytext + yyextra->curIndent;
1482 yyextra->docBlock += yytext;
1485 yyextra->docBlock += yytext;
1489 yyextra->docBlock += yytext;
1491 {CMD}"ifile"{B}+"\""[^\n\"]+"\"" {
1492 yyextra->fileName = &yytext[6];
1493 yyextra->fileName = yyextra->fileName.stripWhiteSpace();
1494 yyextra->fileName = yyextra->fileName.mid(1,yyextra->fileName.length()-2);
1495 yyextra->docBlock+=yytext;
1497 {CMD}"ifile"{B}+{FILEMASK} {
1498 yyextra->fileName = &yytext[6];
1499 yyextra->fileName = yyextra->fileName.stripWhiteSpace();
1500 yyextra->docBlock+=yytext;
1502 {CMD}"iline"{LINENR}/[\n\.] |
1503 {CMD}"iline"{LINENR}{B} {
1508 warn(yyextra->fileName,yyextra->yyLineNr,
"Invalid line number '%s' for iline command",yytext);
1512 yyextra->yyLineNr = nr;
1514 yyextra->docBlock+=yytext;
int toInt(bool *ok=nullptr, int base=10) const
#define warn(file, line, fmt,...)
1516 ({CMD}{CMD}){ID}/[^a-z_A-Z0-9] {
1517 yyextra->docBlock+=yytext;
1520 yyextra->docBlock += yytext;
1523 yyextra->docBlock += yytext;
1531 yyextra->docBlock+=
'\n';
1532 yyextra->docBrief =
FALSE;
1535 {CMD}"ifile"{B}+"\""[^\n\"]+"\"" {
1536 yyextra->fileName = &yytext[6];
1537 yyextra->fileName = yyextra->fileName.stripWhiteSpace();
1538 yyextra->fileName = yyextra->fileName.mid(1,yyextra->fileName.length()-2);
1539 yyextra->docBlock+=yytext;
1541 {CMD}"ifile"{B}+{FILEMASK} {
1542 yyextra->fileName = &yytext[6];
1543 yyextra->fileName = yyextra->fileName.stripWhiteSpace();
1544 yyextra->docBlock+=yytext;
1546 {CMD}"iline"{LINENR}/[\n\.] |
1547 {CMD}"iline"{LINENR}{B} {
1552 warn(yyextra->fileName,yyextra->yyLineNr,
"Invalid line number '%s' for iline command",yytext);
1556 yyextra->yyLineNr = nr;
1558 yyextra->docBlock+=yytext;
1560 ({CMD}{CMD}){ID}/[^a-z_A-Z0-9] {
1561 yyextra->docBlock+=yytext;
1565 int extraSpaces = std::max(0,
static_cast<int>(yyleng-9-yyextra->curIndent-2));
1566 indent.
fill(
' ',extraSpaces);
1568 yyextra->docBlock +=
"\\ilinebr ";
1569 yyextra->docBlock += indent;
void fill(char c, int len=-1)
Fills a string with a predefined character.
1572 yyextra->docBlock+=yytext;
1576 if (yyextra->docBlockContext == VariableEnd)
1584 BEGIN(yyextra->docBlockContext);
1587 yyextra->docBlock+=*yytext;
1604 BEGIN(yyextra->stringContext);
1627 BEGIN(yyextra->stringContext);
1638 {ENDTRIDOUBLEQUOTE} |
1639 {ENDTRISINGLEQUOTE} {
1640 *yyextra->copyString << yytext;
1641 if (yyextra->doubleQuote==(yytext[0]==
'"'))
1643 BEGIN(yyextra->stringContext);
1648 ({LONGSTRINGBLOCK}) {
1650 *yyextra->copyString << yytext;
1654 *yyextra->copyString << yytext;
1657 *yyextra->copyString << *yytext;
1663 yyextra->doubleQuote=
TRUE;
1664 yyextra->decoratorCommentStr.str(std::string());
1665 yyextra->copyString=&yyextra->decoratorCommentStr;
1666 yyextra->stringContext=YY_START;
1667 BEGIN(TripleString);
1671 yyextra->doubleQuote=
FALSE;
1672 yyextra->decoratorCommentStr.str(std::string());
1673 yyextra->copyString=&yyextra->decoratorCommentStr;
1674 yyextra->stringContext=YY_START;
1675 BEGIN(TripleString);
1678 yyextra->stringContext=YY_START;
1679 yyextra->decoratorCommentStr.str(std::string());
1680 yyextra->copyString=&yyextra->decoratorCommentStr;
1681 BEGIN( SingleQuoteString );
1684 yyextra->stringContext=YY_START;
1685 yyextra->decoratorCommentStr.str(std::string());
1686 yyextra->copyString=&yyextra->decoratorCommentStr;
1687 BEGIN( DoubleQuoteString );
1690 yyextra->decoratorRound++;
1693 yyextra->decoratorRound--;
1694 if (!yyextra->decoratorRound) BEGIN(
Search );
1736 struct yyguts_t *yyg = (
struct yyguts_t*)yyscanner;
1738 const char *p = yyextra->inputString + yyextra->inputPosition;
1739 while ( c < max_size && *p ) { *buf++ = *p++; c++; }
1740 yyextra->inputPosition+=c;
1746 struct yyguts_t *yyg = (
struct yyguts_t*)yyscanner;
1749 yyextra->isStatic =
FALSE;
1751 yyextra->previous = 0;
1752 yyextra->packageCommentAllowed =
TRUE;
1757 struct yyguts_t *yyg = (
struct yyguts_t*)yyscanner;
1759 yyextra->current->protection = yyextra->protection ;
1760 yyextra->current->mtype = yyextra->mtype;
1761 yyextra->current->virt = yyextra->virt;
1762 yyextra->current->isStatic = yyextra->isStatic;
1764 yyextra->current->type.clear();
1765 yyextra->current->name.clear();
1766 yyextra->commentScanner.initGroupInfo(yyextra->current.get());
1767 yyextra->isStatic =
FALSE;
1772 struct yyguts_t *yyg = (
struct yyguts_t*)yyscanner;
1774 if (yyextra->checkDupEntry)
1776 for (
auto &v : yyextra->current_root->children())
1779 if (v->name==yyextra->current->name && v->section==yyextra->current->section)
1781 if (v->doc.isEmpty() && !yyextra->current->doc.isEmpty())
1783 v->doc = yyextra->current->doc;
1784 v->docLine = yyextra->current->docLine;
1785 v->docFile = yyextra->current->docFile;
1787 if (v->brief.isEmpty() && !yyextra->current->brief.isEmpty())
1789 v->brief = yyextra->current->brief;
1790 v->briefLine = yyextra->current->briefLine;
1791 v->briefFile = yyextra->current->briefFile;
1793 if (v->type.isEmpty() && !yyextra->current->type.isEmpty())
1796 v->type = yyextra->current->type;
1805 yyextra->previous = yyextra->current;
1806 yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
1813 struct yyguts_t *yyg = (
struct yyguts_t*)yyscanner;
1815 auto doc = yyextra->current->doc;
1816 auto docLine = yyextra->current->docLine;
1817 auto docFile = yyextra->current->docFile;
1818 auto brief = yyextra->current->brief;
1819 auto briefLine = yyextra->current->briefLine;
1820 auto briefFile = yyextra->current->briefFile;
1822 yyextra->previous = yyextra->current;
1823 yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
1826 yyextra->current->doc = doc;
1827 yyextra->current->docLine = docLine;
1828 yyextra->current->docFile = docFile;
1829 yyextra->current->brief = brief;
1830 yyextra->current->briefLine = briefLine;
1831 yyextra->current->briefFile = briefFile;
1836 struct yyguts_t *yyg = (
struct yyguts_t*)yyscanner;
1837 if (!yyextra->current->name.isEmpty() && yyextra->current->name.at(0)==
'_')
1839 if (yyextra->current->name.at(1)==
'_')
1852 struct yyguts_t *yyg = (
struct yyguts_t*)yyscanner;
1853 yyextra->current->name = name;
1854 yyextra->current->section=EntryType::makeVariable();
1855 yyextra->current->fileName = yyextra->fileName;
1856 yyextra->current->startLine = yyextra->yyLineNr;
1857 yyextra->current->bodyLine = yyextra->yyLineNr;
1858 yyextra->current->type.clear();
1860 yyextra->checkDupEntry =
true;
1865 struct yyguts_t *yyg = (
struct yyguts_t*)yyscanner;
1867 if (yyextra->current_root->section.isCompound())
1869 yyextra->current->isStatic =
TRUE;
1876 struct yyguts_t *yyg = (
struct yyguts_t*)yyscanner;
1878 if (yyextra->current_root->section.isCompound())
1880 yyextra->current->isStatic =
TRUE;
1887 struct yyguts_t *yyg = (
struct yyguts_t*)yyscanner;
1888 if (yyextra->current->name.startsWith(
"__") && yyextra->current->name.endsWith(
"__"))
1909 else if (c==
'\t') col+=tabSize-(col%tabSize);
1917 struct yyguts_t *yyg = (
struct yyguts_t*)yyscanner;
1918 auto it = yyextra->packageNameCache.
find(path.
str());
1919 if (it!=yyextra->packageNameCache.end())
1934 scope+=path.
mid(i+1);
1935 yyextra->packageNameCache.emplace(path.
str(),scope.
str());
1944 if (fileName.
isEmpty())
return fileName;
1951 struct yyguts_t *yyg = (
struct yyguts_t*)yyscanner;
1952 QCString item=all ? yyextra->packageName : yyextra->packageName+
"."+yytext;
1954 yyextra->current->fileName = yyextra->fileName;
1956 yyextra->current->section=all ? EntryType::makeUsingDir() : EntryType::makeUsingDecl();
1957 yyextra->current_root->moveToSubEntryAndRefresh(yyextra->current);
1964 struct yyguts_t *yyg = (
struct yyguts_t*)yyscanner;
1965 DBG_CTX((stderr,
"yyextra->yyLineNr=%d\n",yyextra->yyLineNr));
1966 for (
const char *p = yytext; *p; ++p)
1968 yyextra->yyLineNr += (*p ==
'\n') ;
1974 struct yyguts_t *yyg = (
struct yyguts_t*)yyscanner;
1975 DBG_CTX((stderr,
"yyextra->yyLineNr=%d\n",yyextra->yyLineNr));
1976 yyextra->yyLineNr++;
1982 struct yyguts_t *yyg = (
struct yyguts_t*)yyscanner;
1985 yyextra->current->briefFile = yyextra->fileName;
1986 yyextra->current->briefLine = yyextra->yyLineNr;
1990 yyextra->current->docFile = yyextra->fileName;
1991 yyextra->current->docLine = yyextra->yyLineNr;
1997 struct yyguts_t *yyg = (
struct yyguts_t*)yyscanner;
2002 yyextra->docBlockInBody=
FALSE;
2004 if (!yyextra->current->doc.isEmpty())
2006 yyextra->current->doc=yyextra->current->doc.stripWhiteSpace()+
"\n\n";
2008 if (yyextra->docBlockInBody && yyextra->previous && !yyextra->previous->doc.isEmpty())
2010 yyextra->previous->doc=yyextra->previous->doc.stripWhiteSpace()+
"\n\n";
2014 bool needsEntry =
false;
2015 int lineNr = brief ? yyextra->current->briefLine : yyextra->current->docLine;
2016 Markdown markdown(yyextra->fileName,lineNr);
2020 while (yyextra->commentScanner.parseCommentBlock(
2021 yyextra->thisParser,
2022 (yyextra->docBlockInBody && yyextra->previous) ? yyextra->previous.get() : yyextra->current.get(),
2026 yyextra->docBlockInBody ?
FALSE : brief,
2027 yyextra->docBlockJavaStyle,
2028 yyextra->docBlockInBody,
2029 yyextra->protection,
2051 struct yyguts_t *yyg = (
struct yyguts_t*)yyscanner;
2053 if (yyextra->bodyEntry)
2055 yyextra->bodyEntry->endBodyLine = yyextra->yyLineNr-correction;
2056 yyextra->bodyEntry = 0;
2064 struct yyguts_t *yyg = (
struct yyguts_t*)yyscanner;
2065 if (yyextra->copyString) (*yyextra->copyString) << s;
2070 struct yyguts_t *yyg = (
struct yyguts_t*)yyscanner;
2071 yyextra->docBlockContext = YY_START;
2072 yyextra->docBlockInBody =
FALSE;
2073 yyextra->docBlockJavaStyle =
TRUE;
2074 yyextra->docBlockSpecial = yytext[strlen(yytext) - 1]==
'!' || !
Config_getBool(PYTHON_DOCSTRING);
2075 yyextra->docBlock.clear();
2076 yyextra->commentIndent = yyextra->curIndent;
2077 yyextra->doubleQuote =
TRUE;
2078 if (yyextra->docBlockSpecial)
2080 yyextra->docBlock.fill(
' ',yyextra->indent);
2087 struct yyguts_t *yyg = (
struct yyguts_t*)yyscanner;
2088 yyextra->docBlockContext = YY_START;
2089 yyextra->docBlockInBody =
FALSE;
2090 yyextra->docBlockJavaStyle =
TRUE;
2091 yyextra->docBlockSpecial = yytext[strlen(yytext) - 1]==
'!' || !
Config_getBool(PYTHON_DOCSTRING);
2092 yyextra->docBlock.clear();
2093 yyextra->commentIndent = yyextra->curIndent;
2094 yyextra->doubleQuote =
FALSE;
2095 if (yyextra->docBlockSpecial)
2097 yyextra->docBlock.fill(
' ',yyextra->indent);
2104 struct yyguts_t *yyg = (
struct yyguts_t*)yyscanner;
2105 yyextra->docBlockContext = YY_START;
2106 yyextra->docBlockInBody =
FALSE;
2107 yyextra->docBlockJavaStyle =
TRUE;
2108 yyextra->docBrief =
TRUE;
2109 yyextra->docBlock.clear();
2110 yyextra->commentIndent = yyextra->curIndent;
2116 struct yyguts_t *yyg = (
struct yyguts_t*)yyscanner;
2117 yyextra->current->fileName = yyextra->fileName;
2118 yyextra->current->startLine = yyextra->yyLineNr;
2119 yyextra->current->bodyLine = yyextra->yyLineNr;
2120 yyextra->current->section = EntryType::makeFunction();
2123 yyextra->current->isStatic = yyextra->isStatic;
2125 yyextra->current->type.clear();
2126 yyextra->current->name.clear();
2127 yyextra->current->args.clear();
2128 yyextra->current->argList.clear();
2129 yyextra->packageCommentAllowed =
FALSE;
2130 yyextra->isStatic=
FALSE;
2136 struct yyguts_t *yyg = (
struct yyguts_t*)yyscanner;
2137 yyextra->current->section = EntryType::makeClass();
2138 yyextra->current->argList.clear();
2139 yyextra->current->type +=
"class" ;
2140 yyextra->current->fileName = yyextra->fileName;
2141 yyextra->current->startLine = yyextra->yyLineNr;
2142 yyextra->current->bodyLine = yyextra->yyLineNr;
2143 yyextra->packageCommentAllowed =
FALSE;
2150 struct yyguts_t *yyg = (
struct yyguts_t*)yyscanner;
2152 for (
size_t i=0; i<rt->children().size(); ++i)
2154 std::shared_ptr<Entry> ce = rt->children()[i];
2155 if (!ce->program.empty())
2160 yyextra->programStr = ce->program.str();
2161 yyextra->inputString = yyextra->programStr.data();
2162 yyextra->inputPosition = 0;
2163 pyscannerYYrestart(
nullptr, yyscanner );
2164 if (ce->section.isCompound())
2166 yyextra->specialBlock =
false;
2167 yyextra->current_root = ce;
2170 else if (ce->parent())
2172 yyextra->current_root = rt;
2175 BEGIN( SearchMemVars );
2177 yyextra->fileName = ce->fileName;
2178 yyextra->yyLineNr = ce->bodyLine ;
2179 yyextra->current = std::make_shared<Entry>();
2182 yyextra->checkDupEntry =
false;
2185 yyextra->commentScanner.enterCompound(yyextra->fileName,yyextra->yyLineNr,name);
2187 pyscannerYYlex(yyscanner) ;
2188 yyextra->lexInit=
TRUE;
2190 yyextra->programStr.clear();
2191 ce->program.str(std::string());
2193 yyextra->commentScanner.leaveCompound(yyextra->fileName,yyextra->yyLineNr,name);
2205 struct yyguts_t *yyg = (
struct yyguts_t*)yyscanner;
2208 if (fileBuf==
nullptr || fileBuf[0]==
'\0')
return;
2210 yyextra->inputString = fileBuf;
2211 yyextra->inputPosition = 0;
2215 yyextra->isStatic =
false;
2217 yyextra->current_root = rt;
2218 yyextra->specialBlock =
false;
2220 yyextra->yyLineNr= 1 ;
2221 yyextra->fileName = fileName;
2222 yyextra->checkDupEntry =
false;
2224 msg(
"Parsing file %s...\n",
qPrint(yyextra->fileName));
2229 if (baseName!=
"__init__")
2231 if (!yyextra->moduleScope.isEmpty())
2233 yyextra->moduleScope+=
"::";
2235 yyextra->moduleScope+=baseName;
2239 QCString scope = yyextra->moduleScope;
2244 pos = scope.
find(
"::",startPos);
2246 if (pos==-1) pos=(int)scope.
length();
2247 yyextra->current = std::make_shared<Entry>();
2249 yyextra->current->name = scope.
left(pos);
2250 yyextra->current->section = EntryType::makeNamespace();
2251 yyextra->current->type =
"namespace";
2252 yyextra->current->fileName = yyextra->fileName;
2253 yyextra->current->startLine = yyextra->yyLineNr;
2254 yyextra->current->bodyLine = yyextra->yyLineNr;
2255 yyextra->current_root = yyextra->current;
2256 rt->moveToSubEntryAndRefresh(yyextra->current);
2257 }
while (pos<(
int)scope.
length());
2261 yyextra->commentScanner.enterFile(yyextra->fileName,yyextra->yyLineNr);
2263 yyextra->current->reset();
2265 pyscannerYYrestart(
nullptr,yyscanner);
2267 pyscannerYYlex(yyscanner);
2268 yyextra->lexInit=
TRUE;
2270 yyextra->commentScanner.leaveFile(yyextra->fileName,yyextra->yyLineNr);
2272 yyextra->programStr.clear();
2273 yyextra->current_root->program.str(std::string());
2282 struct yyguts_t *yyg = (
struct yyguts_t*)yyscanner;
2286 warn(yyextra->fileName,yyextra->yyLineNr,
"Empty prototype found!");
2290 yyextra->specialBlock =
FALSE;
2291 yyextra->packageCommentAllowed =
FALSE;
2294 YY_BUFFER_STATE orgState = YY_CURRENT_BUFFER;
2295 yy_switch_to_buffer(yy_create_buffer(
nullptr,
YY_BUF_SIZE, yyscanner), yyscanner);
2296 const char *orgInputString = yyextra->inputString;
2297 int orgInputPosition = yyextra->inputPosition;
2300 yyextra->inputString = text.
data();
2301 yyextra->inputPosition = 0;
2302 pyscannerYYrestart(
nullptr, yyscanner );
2304 BEGIN( FunctionDec );
2306 pyscannerYYlex(yyscanner);
2307 yyextra->lexInit=
TRUE;
2309 yyextra->current->name = yyextra->current->name.stripWhiteSpace();
2310 if (yyextra->current->section.isMemberDoc() && yyextra->current->args.isEmpty())
2312 yyextra->current->section = EntryType::makeVariableDoc();
2317 yy_delete_buffer(YY_CURRENT_BUFFER, yyscanner);
2318 yy_switch_to_buffer(orgState, yyscanner);
2320 yyextra->inputString = orgInputString;
2321 yyextra->inputPosition = orgInputPosition;
2336 pyscannerYYlex_init_extra(&
p->state,&
p->yyscanner);
2344 pyscannerYYlex_destroy(
p->yyscanner);
2349 const char *fileBuf,
2350 const std::shared_ptr<Entry> &root,
2353 struct yyguts_t *yyg = (
struct yyguts_t*)
p->yyscanner;
2354 yyextra->thisParser =
this;
2374#include "pyscanner.l.h"
Clang parser object for a single translation unit, which consists of a source file and the directly o...
static bool isFlagSet(const DebugMask mask)
Minimal replacement for QFileInfo.
std::string dirPath(bool absPath=true) const
std::string baseName() const
Helper class to process markdown formatted text.
QCString process(const QCString &input, int &startNewlines, bool fromParseInput=false)
bool needsPreprocessing(const QCString &extension) const override
Returns TRUE if the language identified by extension needs the C preprocessor to be run before feed t...
void parseInput(const QCString &fileName, const char *fileBuf, const std::shared_ptr< Entry > &root, ClangTUParser *clangParser) override
Parses a single input file with the goal to build an Entry tree.
std::unique_ptr< Private > p
~PythonOutlineParser() override
void parsePrototype(const QCString &text) override
Callback function called by the comment block scanner.
int find(char c, int index=0, bool cs=TRUE) const
size_t length() const
Returns the length of the string, not counting the 0-terminator.
QCString mid(size_t index, size_t len=static_cast< size_t >(-1)) const
const std::string & str() const
int findRev(char c, int index=-1, bool cs=TRUE) const
const char * data() const
Returns a pointer to the contents of the string in the form of a 0-terminated C string.
QCString left(size_t len) const
static int yyread(yyscan_t yyscanner, char *buf, int max_size)
#define Config_getInt(name)
#define Config_getBool(name)
static void startCommentBlock(yyscan_t yyscanner, bool)
static void parseMain(yyscan_t yyscanner, const QCString &fileName, const char *fileBuf, const std::shared_ptr< Entry > &rt, FortranFormat format)
void msg(const char *fmt,...)
static void parsePrototype(yyscan_t yyscanner, const QCString &text)
static void parseCompounds(yyscan_t yyscanner, std::shared_ptr< Entry > rt)
QCString stripIndentation(const QCString &s)