ParseCmd.3
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:20k
源码类别:

通讯编程

开发平台:

Visual C++

  1. '"
  2. '" Copyright (c) 1997 Sun Microsystems, Inc.
  3. '"
  4. '" See the file "license.terms" for information on usage and redistribution
  5. '" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  6. '" 
  7. '" RCS: @(#) $Id: ParseCmd.3,v 1.10.2.2 2005/09/15 23:21:37 msofer Exp $
  8. '" 
  9. .so man.macros
  10. .TH Tcl_ParseCommand 3 8.3 Tcl "Tcl Library Procedures"
  11. .BS
  12. .SH NAME
  13. Tcl_ParseCommand, Tcl_ParseExpr, Tcl_ParseBraces, Tcl_ParseQuotedString, Tcl_ParseVarName, Tcl_ParseVar, Tcl_FreeParse, Tcl_EvalTokens, Tcl_EvalTokensStandard - parse Tcl scripts and expressions
  14. .SH SYNOPSIS
  15. .nf
  16. fB#include <tcl.h>fR
  17. .sp
  18. int
  19. fBTcl_ParseCommandfR(fIinterp, string, numBytes, nested, parsePtrfR)
  20. .sp
  21. int
  22. fBTcl_ParseExprfR(fIinterp, string, numBytes, parsePtrfR)
  23. .sp
  24. int
  25. fBTcl_ParseBracesfR(fIinterp, string, numBytes, parsePtr, append, termPtrfR)
  26. .sp
  27. int
  28. fBTcl_ParseQuotedStringfR(fIinterp, string, numBytes, parsePtr, append, termPtrfR)
  29. .sp
  30. int
  31. fBTcl_ParseVarNamefR(fIinterp, string, numBytes, parsePtr, appendfR)
  32. .sp
  33. CONST char *
  34. fBTcl_ParseVarfR(fIinterp, string, termPtrfR)
  35. .sp
  36. fBTcl_FreeParsefR(fIusedParsePtrfR)
  37. .sp
  38. Tcl_Obj *
  39. fBTcl_EvalTokensfR(fIinterp, tokenPtr, numTokensfR)
  40. .sp
  41. int
  42. fBTcl_EvalTokensStandardfR(fIinterp, tokenPtr, numTokensfR)
  43. .SH ARGUMENTS
  44. .AS Tcl_Interp *usedParsePtr
  45. .AP Tcl_Interp *interp out
  46. For procedures other than fBTcl_FreeParsefR, fBTcl_EvalTokensfR
  47. and fBTcl_EvalTokensStandardfR, used only for error reporting;
  48. if NULL, then no error messages are left after errors.
  49. For fBTcl_EvalTokensfR and fBTcl_EvalTokensStandardfR,
  50. determines the context for evaluating the
  51. script and also is used for error reporting; must not be NULL.
  52. .AP "CONST char" *string in
  53. Pointer to first character in string to parse.
  54. .AP int numBytes in
  55. Number of bytes in fIstringfR, not including any terminating null
  56. character.  If less than 0 then the script consists of all characters
  57. in fIstringfR up to the first null character.
  58. .AP int nested in
  59. Non-zero means that the script is part of a command substitution so an
  60. unquoted close bracket should be treated as a command terminator.  If zero,
  61. close brackets have no special meaning. 
  62. .AP int append in
  63. Non-zero means that fI*parsePtrfR already contains valid tokens; the new
  64. tokens should be appended to those already present.  Zero means that
  65. fI*parsePtrfR is uninitialized; any information in it is ignored.
  66. This argument is normally 0.
  67. .AP Tcl_Parse *parsePtr out
  68. Points to structure to fill in with information about the parsed
  69. command, expression, variable name, etc.
  70. Any previous information in this structure
  71. is ignored, unless fIappendfR is non-zero in a call to
  72. fBTcl_ParseBracesfR, fBTcl_ParseQuotedStringfR,
  73. or fBTcl_ParseVarNamefR.
  74. .AP "CONST char" **termPtr out
  75. If not NULL, points to a location where
  76. fBTcl_ParseBracesfR, fBTcl_ParseQuotedStringfR, and
  77. fBTcl_ParseVarfR will store a pointer to the character
  78. just after the terminating character (the close-brace, the last
  79. character of the variable name, or the close-quote (respectively))
  80. if the parse was successful.
  81. .AP Tcl_Parse *usedParsePtr in
  82. Points to structure that was filled in by a previous call to
  83. fBTcl_ParseCommandfR, fBTcl_ParseExprfR, fBTcl_ParseVarNamefR, etc.
  84. .BE
  85. .SH DESCRIPTION
  86. .PP
  87. These procedures parse Tcl commands or portions of Tcl commands such as
  88. expressions or references to variables.
  89. Each procedure takes a pointer to a script (or portion thereof)
  90. and fills in the structure pointed to by fIparsePtrfR
  91. with a collection of tokens describing the information that was parsed.
  92. The procedures normally return fBTCL_OKfR.
  93. However, if an error occurs then they return fBTCL_ERRORfR,
  94. leave an error message in fIinterp'sfR result
  95. (if fIinterpfR is not NULL),
  96. and leave nothing in fIparsePtrfR.
  97. .PP
  98. fBTcl_ParseCommandfR is a procedure that parses Tcl
  99. scripts.  Given a pointer to a script, it
  100. parses the first command from the script.  If the command was parsed
  101. successfully, fBTcl_ParseCommandfR returns fBTCL_OKfR and fills in the
  102. structure pointed to by fIparsePtrfR with information about the
  103. structure of the command (see below for details).
  104. If an error occurred in parsing the command then
  105. fBTCL_ERRORfR is returned, an error message is left in fIinterpfR's
  106. result, and no information is left at fI*parsePtrfR.
  107. .PP
  108. fBTcl_ParseExprfR parses Tcl expressions.
  109. Given a pointer to a script containing an expression,
  110. fBTcl_ParseExprfR parses the expression.
  111. If the expression was parsed successfully,
  112. fBTcl_ParseExprfR returns fBTCL_OKfR and fills in the
  113. structure pointed to by fIparsePtrfR with information about the
  114. structure of the expression (see below for details).
  115. If an error occurred in parsing the command then
  116. fBTCL_ERRORfR is returned, an error message is left in fIinterpfR's
  117. result, and no information is left at fI*parsePtrfR.
  118. .PP
  119. fBTcl_ParseBracesfR parses a string or command argument
  120. enclosed in braces such as
  121. fB{hello}fR or fB{string \t with \t tabs}fR
  122. from the beginning of its argument fIstringfR.
  123. The first character of fIstringfR must be fB{fR. 
  124. If the braced string was parsed successfully,
  125. fBTcl_ParseBracesfR returns fBTCL_OKfR,
  126. fills in the structure pointed to by fIparsePtrfR
  127. with information about the structure of the string
  128. (see below for details),
  129. and stores a pointer to the character just after the terminating fB}fR
  130. in the location given by fI*termPtrfR.
  131. If an error occurs while parsing the string
  132. then fBTCL_ERRORfR is returned,
  133. an error message is left in fIinterpfR's result,
  134. and no information is left at fI*parsePtrfR or fI*termPtrfR.
  135. .PP
  136. fBTcl_ParseQuotedStringfR parses a double-quoted string such as
  137. fB"sum is [expr $a+$b]"fR
  138. from the beginning of the argument fIstringfR.
  139. The first character of fIstringfR must be fB"fR. 
  140. If the double-quoted string was parsed successfully,
  141. fBTcl_ParseQuotedStringfR returns fBTCL_OKfR,
  142. fills in the structure pointed to by fIparsePtrfR
  143. with information about the structure of the string
  144. (see below for details),
  145. and stores a pointer to the character just after the terminating fB"fR
  146. in the location given by fI*termPtrfR.
  147. If an error occurs while parsing the string
  148. then fBTCL_ERRORfR is returned,
  149. an error message is left in fIinterpfR's result,
  150. and no information is left at fI*parsePtrfR or fI*termPtrfR.
  151. .PP
  152. fBTcl_ParseVarNamefR parses a Tcl variable reference such as
  153. fB$abcfR or fB$x([expr $index + 1])fR from the beginning of its
  154. fIstringfR argument.
  155. The first character of fIstringfR must be fB$fR. 
  156. If a variable name was parsed successfully, fBTcl_ParseVarNamefR
  157. returns fBTCL_OKfR and fills in the structure pointed to by
  158. fIparsePtrfR with information about the structure of the variable name
  159. (see below for details).  If an error
  160. occurs while parsing the command then fBTCL_ERRORfR is returned, an
  161. error message is left in fIinterpfR's result (if fIinterpfR isn't
  162. NULL), and no information is left at fI*parsePtrfR.
  163. .PP
  164. fBTcl_ParseVarfR parse a Tcl variable reference such as fB$abcfR
  165. or fB$x([expr $index + 1])fR from the beginning of its fIstringfR
  166. argument.  The first character of fIstringfR must be fB$fR.  If
  167. the variable name is parsed successfully, fBTcl_ParseVarfR returns a
  168. pointer to the string value of the variable.  If an error occurs while
  169. parsing, then NULL is returned and an error message is left in
  170. fIinterpfR's result.
  171. .PP
  172. The information left at fI*parsePtrfR
  173. by fBTcl_ParseCommandfR, fBTcl_ParseExprfR, fBTcl_ParseBracesfR,
  174. fBTcl_ParseQuotedStringfR, and fBTcl_ParseVarNamefR
  175. may include dynamically allocated memory.
  176. If these five parsing procedures return fBTCL_OKfR
  177. then the caller must invoke fBTcl_FreeParsefR to release
  178. the storage at fI*parsePtrfR.
  179. These procedures ignore any existing information in
  180. fI*parsePtrfR (unless fIappendfR is non-zero),
  181. so if repeated calls are being made to any of them
  182. then fBTcl_FreeParsefR must be invoked once after each call.
  183. .PP
  184. fBTcl_EvalTokensStandardfR evaluates a sequence of parse tokens from
  185. a Tcl_Parse structure.  The tokens typically consist
  186. of all the tokens in a word or all the tokens that make up the index for
  187. a reference to an array variable.  fBTcl_EvalTokensStandardfR performs the
  188. substitutions requested by the tokens and concatenates the
  189. resulting values. 
  190. The return value from fBTcl_EvalTokensStandardfR is a Tcl completion
  191. code with one of the values fBTCL_OKfR, fBTCL_ERRORfR,
  192. fBTCL_RETURNfR, fBTCL_BREAKfR, or fBTCL_CONTINUEfR, or possibly
  193. some other integer value originating in an extension.
  194. In addition, a result value or error message is left in fIinterpfR's
  195. result; it can be retrieved using fBTcl_GetObjResultfR.
  196. .PP
  197. fBTcl_EvalTokensfR differs from fBTcl_EvalTokensStandardfR only in
  198. the return convention used: it returns the result in a new Tcl_Obj.
  199. The reference count of the object returned as result has been
  200. incremented, so the caller must
  201. invoke fBTcl_DecrRefCountfR when it is finished with the object.
  202. If an error or other exception occurs while evaluating the tokens
  203. (such as a reference to a non-existent variable) then the return value
  204. is NULL and an error message is left in fIinterpfR's result. The use
  205. of fBTcl_EvalTokensfR is deprecated.
  206. .SH "TCL_PARSE STRUCTURE"
  207. .PP
  208. fBTcl_ParseCommandfR, fBTcl_ParseExprfR, fBTcl_ParseBracesfR,
  209. fBTcl_ParseQuotedStringfR, and fBTcl_ParseVarNamefR
  210. return parse information in two data structures, Tcl_Parse and Tcl_Token:
  211. .CS
  212. typedef struct Tcl_Parse {
  213. CONST char *fIcommentStartfR;
  214. int fIcommentSizefR;
  215. CONST char *fIcommandStartfR;
  216. int fIcommandSizefR;
  217. int fInumWordsfR;
  218. Tcl_Token *fItokenPtrfR;
  219. int fInumTokensfR;
  220. ...
  221. } Tcl_Parse;
  222. typedef struct Tcl_Token {
  223.     int fItypefR;
  224.     CONST char *fIstartfR;
  225.     int fIsizefR;
  226.     int fInumComponentsfR;
  227. } Tcl_Token;
  228. .CE
  229. .PP
  230. The first five fields of a Tcl_Parse structure
  231. are filled in only by fBTcl_ParseCommandfR.
  232. These fields are not used by the other parsing procedures.
  233. .PP
  234. fBTcl_ParseCommandfR fills in a Tcl_Parse structure
  235. with information that describes one Tcl command and any comments that
  236. precede the command.
  237. If there are comments,
  238. the fIcommentStartfR field points to the fB#fR character that begins
  239. the first comment and fIcommentSizefR indicates the number of bytes
  240. in all of the comments preceding the command, including the newline
  241. character that terminates the last comment.
  242. If the command is not preceded by any comments, fIcommentSizefR is 0.
  243. fBTcl_ParseCommandfR also sets the fIcommandStartfR field
  244. to point to the first character of the first
  245. word in the command (skipping any comments and leading space) and 
  246. fIcommandSizefR gives the total number of bytes in the command,
  247. including the character pointed to by fIcommandStartfR up to and
  248. including the newline, close bracket, or semicolon character that
  249. terminates the command.  The fInumWordsfR field gives the
  250. total number of words in the command.
  251. .PP
  252. All parsing procedures set the remaining fields,
  253. fItokenPtrfR and fInumTokensfR.
  254. The fItokenPtrfR field points to the first in an array of Tcl_Token
  255. structures that describe the components of the entity being parsed.
  256. The fInumTokensfR field gives the total number of tokens
  257. present in the array.
  258. Each token contains four fields.
  259. The fItypefR field selects one of several token types
  260. that are described below.  The fIstartfR field
  261. points to the first character in the token and the fIsizefR field
  262. gives the total number of characters in the token.  Some token types,
  263. such as fBTCL_TOKEN_WORDfR and fBTCL_TOKEN_VARIABLEfR, consist of
  264. several component tokens, which immediately follow the parent token;
  265. the fInumComponentsfR field describes how many of these there are.
  266. The fItypefR field has one of the following values:
  267. .TP 20
  268. fBTCL_TOKEN_WORDfR
  269. This token ordinarily describes one word of a command
  270. but it may also describe a quoted or braced string in an expression.
  271. The token describes a component of the script that is
  272. the result of concatenating together a sequence of subcomponents,
  273. each described by a separate subtoken.
  274. The token starts with the first non-blank
  275. character of the component (which may be a double-quote or open brace)
  276. and includes all characters in the component up to but not including the
  277. space, semicolon, close bracket, close quote, or close brace that
  278. terminates the component.  The fInumComponentsfR field counts the total
  279. number of sub-tokens that make up the word, including sub-tokens
  280. of fBTCL_TOKEN_VARIABLEfR and fBTCL_TOKEN_BSfR tokens.
  281. .TP
  282. fBTCL_TOKEN_SIMPLE_WORDfR
  283. This token has the same meaning as fBTCL_TOKEN_WORDfR, except that
  284. the word is guaranteed to consist of a single fBTCL_TOKEN_TEXTfR
  285. sub-token.  The fInumComponentsfR field is always 1.
  286. .TP
  287. fBTCL_TOKEN_TEXTfR
  288. The token describes a range of literal text that is part of a word.
  289. The fInumComponentsfR field is always 0.
  290. .TP
  291. fBTCL_TOKEN_BSfR
  292. The token describes a backslash sequence such as fBenfR or fBe0xa3fR.
  293. The fInumComponentsfR field is always 0.
  294. .TP
  295. fBTCL_TOKEN_COMMANDfR
  296. The token describes a command whose result result must be substituted into
  297. the word.  The token includes the square brackets that surround the
  298. command.  The fInumComponentsfR field is always 0 (the nested command
  299. is not parsed; call fBTcl_ParseCommandfR recursively if you want to
  300. see its tokens).
  301. .TP
  302. fBTCL_TOKEN_VARIABLEfR
  303. The token describes a variable substitution, including the
  304. fB$fR, variable name, and array index (if there is one) up through the
  305. close parenthesis that terminates the index.  This token is followed
  306. by one or more additional tokens that describe the variable name and
  307. array index.  If fInumComponentsfR  is 1 then the variable is a
  308. scalar and the next token is a fBTCL_TOKEN_TEXTfR token that gives the
  309. variable name.  If fInumComponentsfR is greater than 1 then the
  310. variable is an array: the first sub-token is a fBTCL_TOKEN_TEXTfR
  311. token giving the array name and the remaining sub-tokens are
  312. fBTCL_TOKEN_TEXTfR, fBTCL_TOKEN_BSfR, fBTCL_TOKEN_COMMANDfR, and
  313. fBTCL_TOKEN_VARIABLEfR tokens that must be concatenated to produce the
  314. array index. The fInumComponentsfR field includes nested sub-tokens
  315. that are part of fBTCL_TOKEN_VARIABLEfR tokens in the array index.
  316. .TP
  317. fBTCL_TOKEN_SUB_EXPRfR
  318. The token describes one subexpression of an expression
  319. (or an entire expression).
  320. A subexpression may consist of a value
  321. such as an integer literal, variable substitution,
  322. or parenthesized subexpression;
  323. it may also consist of an operator and its operands.
  324. The token starts with the first non-blank character of the subexpression
  325. up to but not including the space, brace, close-paren, or bracket
  326. that terminates the subexpression.
  327. This token is followed by one or more additional tokens
  328. that describe the subexpression.
  329. If the first sub-token after the fBTCL_TOKEN_SUB_EXPRfR token
  330. is a fBTCL_TOKEN_OPERATORfR token,
  331. the subexpression consists of an operator and its token operands.
  332. If the operator has no operands, the subexpression consists of
  333. just the fBTCL_TOKEN_OPERATORfR token.
  334. Each operand is described by a fBTCL_TOKEN_SUB_EXPRfR token.
  335. Otherwise, the subexpression is a value described by
  336. one of the token types fBTCL_TOKEN_WORDfR, fBTCL_TOKEN_TEXTfR,
  337. fBTCL_TOKEN_BSfR, fBTCL_TOKEN_COMMANDfR, 
  338. fBTCL_TOKEN_VARIABLEfR, and fBTCL_TOKEN_SUB_EXPRfR.
  339. The fInumComponentsfR field
  340. counts the total number of sub-tokens that make up the subexpression;
  341. this includes the sub-tokens for any nested fBTCL_TOKEN_SUB_EXPRfR tokens.
  342. .TP
  343. fBTCL_TOKEN_OPERATORfR
  344. The token describes one operator of an expression
  345. such as fB&&fR or fBhypotfR.
  346. An fBTCL_TOKEN_OPERATORfR token is always preceded by a
  347. fBTCL_TOKEN_SUB_EXPRfR token
  348. that describes the operator and its operands;
  349. the fBTCL_TOKEN_SUB_EXPRfR token's fInumComponentsfR field
  350. can be used to determine the number of operands.
  351. A binary operator such as fB*fR
  352. is followed by two fBTCL_TOKEN_SUB_EXPRfR tokens
  353. that describe its operands.
  354. A unary operator like fB-fR
  355. is followed by a single fBTCL_TOKEN_SUB_EXPRfR token
  356. for its operand.
  357. If the operator is a math function such as fBlog10fR,
  358. the fBTCL_TOKEN_OPERATORfR token will give its name and
  359. the following fBTCL_TOKEN_SUB_EXPRfR tokens will describe
  360. its operands;
  361. if there are no operands (as with fBrandfR),
  362. no fBTCL_TOKEN_SUB_EXPRfR tokens follow.
  363. There is one trinary operator, fB?fR,
  364. that appears in if-then-else subexpressions
  365. such as fIxfB?fIyfB:fIzfR;
  366. in this case, the fB?fR fBTCL_TOKEN_OPERATORfR token
  367. is followed by three fBTCL_TOKEN_SUB_EXPRfR tokens for the operands
  368. fIxfR, fIyfR, and fIzfR.
  369. The fInumComponentsfR field for a fBTCL_TOKEN_OPERATORfR token
  370. is always 0.
  371. .PP
  372. After fBTcl_ParseCommandfR returns, the first token pointed to by
  373. the fItokenPtrfR field of the
  374. Tcl_Parse structure always has type fBTCL_TOKEN_WORDfR or
  375. fBTCL_TOKEN_SIMPLE_WORDfR.  It is followed by the sub-tokens
  376. that must be concatenated to produce the value of that word.
  377. The next token is the fBTCL_TOKEN_WORDfR or fBTCL_TOKEN_SIMPLE_WORDfR
  378. token for the second word, followed by sub-tokens for that
  379. word, and so on until all fInumWordsfR have been accounted
  380. for.
  381. .PP
  382. After fBTcl_ParseExprfR returns, the first token pointed to by
  383. the fItokenPtrfR field of the
  384. Tcl_Parse structure always has type fBTCL_TOKEN_SUB_EXPRfR.
  385. It is followed by the sub-tokens that must be evaluated
  386. to produce the value of the expression.
  387. Only the token information in the Tcl_Parse structure
  388. is modified: the fIcommentStartfR, fIcommentSizefR,
  389. fIcommandStartfR, and fIcommandSizefR fields are not modified
  390. by fBTcl_ParseExprfR.
  391. .PP
  392. After fBTcl_ParseBracesfR returns,
  393. the array of tokens pointed to by the fItokenPtrfR field of the
  394. Tcl_Parse structure will contain a single fBTCL_TOKEN_TEXTfR token
  395. if the braced string does not contain any backslash-newlines.
  396. If the string does contain backslash-newlines,
  397. the array of tokens will contain one or more
  398. fBTCL_TOKEN_TEXTfR or fBTCL_TOKEN_BSfR sub-tokens
  399. that must be concatenated to produce the value of the string.
  400. If the braced string was just fB{}fR
  401. (that is, the string was empty),
  402. the single fBTCL_TOKEN_TEXTfR token will have a fIsizefR field
  403. containing zero;
  404. this ensures that at least one token appears
  405. to describe the braced string.
  406. Only the token information in the Tcl_Parse structure
  407. is modified: the fIcommentStartfR, fIcommentSizefR,
  408. fIcommandStartfR, and fIcommandSizefR fields are not modified
  409. by fBTcl_ParseBracesfR.
  410. .PP
  411. After fBTcl_ParseQuotedStringfR returns,
  412. the array of tokens pointed to by the fItokenPtrfR field of the
  413. Tcl_Parse structure depends on the contents of the quoted string.
  414. It will consist of one or more fBTCL_TOKEN_TEXTfR, fBTCL_TOKEN_BSfR,
  415. fBTCL_TOKEN_COMMANDfR, and fBTCL_TOKEN_VARIABLEfR sub-tokens.
  416. The array always contains at least one token;
  417. for example, if the argument fIstringfR is empty,
  418. the array returned consists of a single fBTCL_TOKEN_TEXTfR token
  419. with a zero fIsizefR field.
  420. Only the token information in the Tcl_Parse structure
  421. is modified: the fIcommentStartfR, fIcommentSizefR,
  422. fIcommandStartfR, and fIcommandSizefR fields are not modified.
  423. .PP
  424. After fBTcl_ParseVarNamefR returns, the first token pointed to by
  425. the fItokenPtrfR field of the
  426. Tcl_Parse structure always has type fBTCL_TOKEN_VARIABLEfR.  It
  427. is followed by the sub-tokens that make up the variable name as
  428. described above.  The total length of the variable name is
  429. contained in the fIsizefR field of the first token.
  430. As in fBTcl_ParseExprfR,
  431. only the token information in the Tcl_Parse structure
  432. is modified by fBTcl_ParseVarNamefR:
  433. the fIcommentStartfR, fIcommentSizefR,
  434. fIcommandStartfR, and fIcommandSizefR fields are not modified.
  435. .PP
  436. All of the character pointers in the
  437. Tcl_Parse and Tcl_Token structures refer
  438. to characters in the fIstringfR argument passed to
  439. fBTcl_ParseCommandfR, fBTcl_ParseExprfR, fBTcl_ParseBracesfR,
  440. fBTcl_ParseQuotedStringfR, and fBTcl_ParseVarNamefR.
  441. .PP
  442. There are additional fields in the Tcl_Parse structure after the
  443. fInumTokensfR field, but these are for the private use of
  444. fBTcl_ParseCommandfR, fBTcl_ParseExprfR, fBTcl_ParseBracesfR,
  445. fBTcl_ParseQuotedStringfR, and fBTcl_ParseVarNamefR; they should not be
  446. referenced by code outside of these procedures.
  447. .SH KEYWORDS
  448. backslash substitution, braces, command, expression, parse, token, variable substitution