libcm is a C development framework with an emphasis on audio signal processing applications.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

cmLex.h 6.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. #ifndef cmLex_h
  2. #define cmLex_h
  3. //{
  4. //(
  5. //)
  6. //(
  7. // Predefined Lexer Id's
  8. enum
  9. {
  10. kErrorLexTId, // 0 the lexer was unable to identify the current token
  11. kUnknownLexTId, // 1 the token is of an unknown type (only used when kReturnUnknownLexFl is set)
  12. kEofLexTId, // 2 the lexer reached the end of input
  13. kSpaceLexTId, // 3 white space
  14. kRealLexTId, // 4 real number (contains a decimal point or is in scientific notation)
  15. kIntLexTId, // 5 decimal integer
  16. kHexLexTId, // 6 hexidecimal integer
  17. kIdentLexTId, // 7 identifier
  18. kQStrLexTId, // 8 quoted string
  19. kBlockCmtLexTId, // 9 block comment
  20. kLineCmtLexTId, // 10 line comment
  21. kUserLexTId // 11 user registered token (See cmLexRegisterToken().)
  22. };
  23. // Lexer control flags used with cmLexInit().
  24. enum
  25. {
  26. kReturnSpaceLexFl = 0x01, //< Return space tokens
  27. kReturnCommentsLexFl = 0x02, //< Return comment tokens
  28. kReturnUnknownLexFl = 0x04, //< Return unknown tokens
  29. kUserDefPriorityLexFl= 0x08 //< User defined tokens take priority even if a kIdentLexTId token has a longer match
  30. };
  31. // cmLex result codes.
  32. enum
  33. {
  34. kOkLexRC = cmOkRC, //< 0 No error. The operation completed successfully
  35. kDuplicateTokenLexRC, //< 1 The text or id passed as a user token is already in use by another token
  36. kMissingCmtEndLexRC, //< 2 The end of a block comment could not be found.
  37. kMissingEndQuoteLexRC, //< 3 The end of a quoted string could not be found.
  38. kNoMatchLexRC, //< 4 The lexer encountered a string which could not be classified.
  39. kFileOpenErrLexRC, //< 5 File open failed on cmLexSetFile()
  40. kFileSeekErrLexRC, //< 6 File seek failed on cmLexSetFile()
  41. kFileTellErrLexRC, //< 7 File tell failed on cmLexSetFile()
  42. kFileReadErrLexRC, //< 8 File read failed on cmLexSetFile()
  43. kFileCloseErrLexRC, //< 9 File close failed on cmLexSetFile()
  44. kMemAllocErrLexRC, //< 10 An attempted memory allocation failed
  45. kEofRC, //< 11 The end of the input text was encountered (this is a normal condition not an error)
  46. kInvalidLexTIdLexRC, //< 12 An invalid lex token id was encountered.
  47. kSignErrorLexRC, //< 13 An signed integer has a 'u' or 'U' suffix."
  48. kInvalidLexRC //< 1r Sentinal value.
  49. };
  50. typedef cmHandle_t cmLexH;
  51. extern cmLexH cmLexNullH;
  52. // Iniitalize the lexer and receive a lexer handle in return.
  53. // Set cp to NULL if the buffer will be later via cmLexSetTextBuffer();
  54. // See the kXXXLexFl enum's above for possible flag values.
  55. cmLexH cmLexInit( const cmChar_t* cp, unsigned cn, unsigned flags, cmRpt_t* rpt );
  56. // Finalize a lexer created by an earlier call to cmLexInit()
  57. cmRC_t cmLexFinal( cmLexH* hp );
  58. // Rewind the lexer to the begining of the buffer (the same as post initialize state)
  59. cmRC_t cmLexReset( cmLexH h );
  60. // Verify that a lexer handle is valid
  61. bool cmLexIsValid( cmLexH h );
  62. // Set a new text buffer and reset the lexer to the post initialize state.
  63. cmRC_t cmLexSetTextBuffer( cmLexH h, const cmChar_t* cp, unsigned cn );
  64. cmRC_t cmLexSetFile( cmLexH h, const cmChar_t* fn );
  65. // Register a user defined token. The id of the first user defined token should be
  66. // kUserLexTId+1. Neither the id or token text can be used by a previously registered
  67. // or built-in token.
  68. cmRC_t cmLexRegisterToken( cmLexH h, unsigned id, const cmChar_t* token );
  69. // Register a user defined token recognition function. This function should return the count
  70. // of initial, consecutive, characters in 'cp' which match its token pattern.
  71. typedef unsigned (*cmLexUserMatcherPtr_t)( const cmChar_t* cp, unsigned cn );
  72. cmRC_t cmLexRegisterMatcher( cmLexH h, unsigned id, cmLexUserMatcherPtr_t funcPtr );
  73. // Enable or disable the specified token type.
  74. cmRC_t cmLexEnableToken( cmLexH h, unsigned id, bool enableFl );
  75. // Get and set the lexer filter flags kReturnXXXLexFl.
  76. // These flags can be safely enabled and disabled between
  77. // calls to cmLexGetNextToken().
  78. unsigned cmLexFilterFlags( cmLexH h );
  79. void cmLexSetFilterFlags( cmLexH h, unsigned flags );
  80. // Return the type id of the current token and advances to the next token
  81. unsigned cmLexGetNextToken( cmLexH h );
  82. // Return the type id associated with the current token. This is the same value
  83. // returned by the previous call to cmLexGetNextToken().
  84. unsigned cmLexTokenId( cmLexH h );
  85. // Return a pointer to the first character of text associated with the
  86. // current token. The returned pointer directly references the text contained
  87. // in the buffer given to the lexer in the call to cmLexInit(). The string
  88. // is therefore not zero terminated. Use cmLexTokenCharCount() to get the
  89. // length of the token string.
  90. const cmChar_t* cmLexTokenText( cmLexH h );
  91. // Return the count of characters in the text associated with the current token.
  92. // This is the only way to get this count since the string returned by
  93. // cmLexTokenText() is not zero terminated.
  94. unsigned cmLexTokenCharCount( cmLexH h );
  95. // Return the value of the current token as an integer.
  96. int cmLexTokenInt( cmLexH h );
  97. // Return the value of the current token as an unsigned integer.
  98. unsigned cmLexTokenUInt( cmLexH h );
  99. // Return the value of the current token as a float.
  100. float cmLexTokenFloat( cmLexH h );
  101. // Return the value of the current token as a double.
  102. double cmLexTokenDouble( cmLexH h );
  103. // Return true if the current token is an int and it was suffixed
  104. // with 'u' to indicate that it is unsigned.
  105. bool cmLexTokenIsUnsigned( cmLexH h );
  106. // Return true if the current token is a real and it was suffexed
  107. // with 'f' to indicate that it is a single precision float.
  108. bool cmLexTokenIsSinglePrecision( cmLexH h );
  109. // Return the line number associated with the current token
  110. unsigned cmLexCurrentLineNumber( cmLexH h );
  111. // Return the starting column of the current token
  112. unsigned cmLexCurrentColumnNumber( cmLexH h );
  113. // Return the RC code associated with the last error
  114. unsigned cmLexErrorRC( cmLexH h );
  115. // Return the label associated with a token id
  116. const cmChar_t* cmLexIdToLabel( cmLexH h, unsigned typeId );
  117. // Return the text message associated with a return code.
  118. const cmChar_t* cmLexRcToMsg( unsigned rc );
  119. // Lexer testing stub.
  120. void cmLexTest( cmRpt_t* rpt );
  121. //)
  122. //}
  123. #endif