token read in diff state
[build-config.git] / doc / design-doc / token-note.txt
blob9103c21a680c18b2a160ba11dd7c00e6faa067eb
1 \r@ test-ex\r@ $\r@ strbuff\r@ codeblock state\r# $(),<(),>(),()\r# func () {}\r@ token combine\r@ envar\r# token-queue/gmr\r# syntax\r# expanssion\r@ string(``,env,$())\r@ expr: expr-assign & env-assign & cmd\r# cmd & expr-assign,= token proc,set in expr-state\r# statement-token + (,set in expr-state\r# [],set expr-state\r@\r@ dollar\r@ macro\r# const-lxr\r# macro(if/define/include/pragma)\r# this doc(proc in <<)\r@ cmd & var-def,type/innerfunc/loadable/cmd\r@\r@ stridx,symbtbl\r@ macro-expanssion switch\r@ '' "" string auto translation switch(macro&cmd)\r\r@ assign &  expr\r# 在code-state中,对于两个token之间包含blank的token缓存到队列。\r# 当有=或+=时,设置env-assign-flag,\r# -=,*=,/=等,设置expr-assign-flag\r# =()或+=()时,进行()的字符串匹配,保存()中的字符串,在gmr中,如果env-assign为expr-assign,不进行env-assign,进行expr-assign。如果为expr-assign,将env-assign解析为expr-assign。\r# 当一个token与上一个token之间包含blank时,判断是否有env-assign-flag,带flag时,合并为ENVASSIGN\r# 当包含env/expr-assign-flag时,切换到expr状态\r# 在expr状态下,连续两个T_WORD时,或;时,返回到上一状态,并返回一个T_STOP_EXPR的 TOKEN,用于从expr的gmr中返回,并忽略该token。\r#\r\r@ token queue,combine & filter & state\r# T_WORD & string & const combine\r# first-token,end-token,\r# cmnt: cmnt-hdr,cmnt\r# macro: macro-token,nl\r# envar: $,}\r# 两个T_WORD时,first token是否为type,非type为cmd,type为vardef/funcdef\r?# expr1: =,;\r?# expr2: env-assign(:=,?=),;\r# expr3: (,)\r# two T_WORD return from expr to upper state,except in () flag。this can compatiable with cmdline。\r\r@ func-codeblock\r# {} after ()\rcmd\r( cmd param )\r{ cmd param; }\r# func\r+ param define between () and {}\r+ func name and param ( in different line\r+\r\r@ ()\r# sub-script,() or $() or <() or >(), in codeblock-state\r# param-def & ivk-param in expr-state\r# expr in expr-state\r# type cast in expr-state\r\r@\r# cort\r# init,只在初始化运行单次\r\r\r@ dollar,cmnt,string,codeblock。test-ex\r# cmnt\r+ #,//,single line comment,or macro statement\r# comment example\r#define aaa 111\r// comment example.\r//comment example.\rcmd param // comment\rcmd param #define aaa 111\r+ /* */,/** **/,multi line cmnt\r/*\r* \func: testfunc\r*/\r/** comment. **/\rcmd param /** comment. **/\r# cmnt-state: /**/\r+ \,@,::,:\r/*\r* @func: testfunc\r* \note:: describe string.\r*  describe string in second line.\r*/\r# $:\r+ #,*,@,?,$,!,\r+ $"",$'',$``,\r+ $(),codeblock-state\r+ $(()),$[],expr-state\r+ envar-state: ${},\r${var}\r${var[0]}\r${#var}\r${#var[0]}\r${!var}\r${!var[0]}\r${var:0:1}\r${var[0]:0:1}\r${var:-value}\r${var:=value}\r${var:?value}\r${var:+value}\r${var:-value}\r${var:=value}\r${var:?value}\r${var:+value}\r${var:+"str"}\r${var:+'str'}\r${var:+`cmd param`}\r${var[0]:0:1}\r${var[0]:0:1//test/#-/@()=_[]+:}\r${var[0]:0:1/=_[/]}\r${var[0]:0:1#*aaa}\r${var[0]:0:1##*aaa}\r${var[0]:0:1%*aaa}\r${var[0]:0:1%%*aaa}\r${var[0]:0:1^^}\r${var[0]:0:1,,}\r# string\r+ '',``,$'',$``,readuntil string\r'test string \'\r`cmd param <>&-`\r$'test\n'\r+ string-state: "",$"",\r"abc${xxx}aaa"\r"abc`echo x`xxx"\r"abc$(echo x)xxx"\r"abc`echo "str"x`xxx"\r"abc$(echo "str"x)xxx"\r# codeblock-state:\r+ $(),\r$(echo xxx"$aaa")\r+ <(),\rcat <(echo xxx"$aaa")\r+ >(),\rexho xxx | tee >(cat -)\r+ {},\rfoo () {\r}\rfoo2 ()\r{\r}\r# expr-state: $(()),$[],()\r+ +-*/%,=,|&~^,!,&&,||,<<,>>,++,--,,,.,->,=>,::,(),{},[],$,"",'',``,\r\r@ state(tbl,proc-func,test-ex)\r# cmdcode(c & sh token)\r# *dollar(pfx-char)\r# envar(!,#,[],:,-,+,=,?,:-,:?,:=,:+,/,//,#,##,%,%%,^^,,,,"",'',``,[])(pfx,name-str,array-idx,opr,opr-content)\r# string($,``,)\r# codeblock("",'',``,$,(),{})macro\r# expr\r# cmnt(\,@,::,:)\r\r@\r# token-tbl\r# state & state-stack\r# flag\r# caching-buff\r# queue\r#\r\r@ lang-elem & token\r# comment\r# macro\r# cmd(env-assign token)\r# expr-assign(var-init)\r# codeblock/subscript\r# statement(statement,)\r# declaration\r# const(string)\r# func-def\r# var-def\r# type-def\r# invoke\r#\r\r@ lxrgmr\r# envar,by code\r# const,lxr\r# expr,lxr/gmr\r# main-gmr,gmr\r# *vardef-gmr\r#\r\r@ macro定义的expanssion,使用设置进行开关\r# "#xxx"进行macro的expanssion,避免所有word进行macro定义的字符串比较。\r# sizeof/typeof/以rsv-wd定义,以macro函数expanssion。\r#\r\r@ const\r# blank/newline seperated T_WORD\r# regex => lxr func after combine\r# string\r# digit\r# oct,0started\r# hex,0started\r# bin,\r# float\r\r@ expanssion\r# 输出到指定offset的buffer,根据expanssion时的state输出到不同buff。\r# envar expanssion\r# subscript expanssion\r# macro expanssion\r#\r\r\r@\r# txt\r+ '',``,read until pair-char\r+ sh/c99-singleline,read until nl。\r+ thisdoc/helpdoc,read until term-str\r+ block-str({},(),$/</>)只进行pair-char的计数,匹配到right-pattern时,即是一个block。\r+ process pfx-char,count pairchar,when level = 0,read until end-str,\r# token combine\r# cmnt\r+ sh/c99-singleline,read until nl。\r+ c-preproc,chk in sh-cmnt\r+ c89/ext-multiline,使用Txt_xxx,只匹配/**/和/****/。\r# dollar,$为pfx,设置pair-flag\r+ (),$(),param-state,code-state\r+ (()),$(()),calc-state\r+ $[],calc-state\r+ [[]],$[[]],sh-judge,calc-state\r+ ${},\r+ $"",$'',$``,在"",'',``之后运行exit响应函数时,根据$标记对字符串进行处理。\r# quoted-str\r+ "",``,$的混合\r\r# code/cmd/expr-state,;/nl,first token为T_WORD的表示cmd,为token的code状态。在()或(())中为expr状态。\r# code\r+ '',"",``,\r+ (),{}\r+ statement/cmd/expr的判断\r- code状态下,第一个token为非T_WORD时,即是statement,仍以code状态运行。\r- 开头的token为T_WORD,第二个token非=时,为cmd状态\r- 第二个token为'='时,=之前的blank为0,且T_WORD不是变量名称,将两个token输出为T_ENVASSIGN,并设置cmd状态。\r- 当第二个token为=,且非T_ENVASSIGN时,为expr状态\r- @开头的语句,为var状态,根据.和->和::和=>获取var的member,return一个T_ATVAR的token,并设置为expr状态。\r- expr状态以;切换到code状态。\r- nl,或;,或&,或&&,或||时,从cmd状态返回到code状态\r- source或include时,保存状态,new-file以code状态使用。\r#\r\r@ token的combine\r# 在token读取函数之外添加wrap,对token进行处理。\r# word combine\r# string combine\r# ENVASSIGN combine\r# var name combine\r#\r\r@ code\r# code\r# cmd\r# func-def\r# assign\r# expr\r# string\r# cmnt/macro\r#\r\r@ cmd statement\r# first token is word,second token is not ( or . or =。\r# wordlist\r# ;,nl\r# &&,||\r# &\r# |,<,>\r#\r\r@ regrx-str,在cmd状态时,以[[:blank:]]为seperator\r# second token进行"(","+=","=","+=(","=("的识别,并根据token之前的blank,判断是否为assignment,切换到不同的状态\r#\r\r@\r# {},()\r# then/else/elif/fi\r# do/done\r# [[/]]\r\r@ elem\r# declaration,\r# var-def,declaration_specifiers\r# func-def,function_definition\r# type-def,declaration_specifiers\r# macro-def,\r# statement(compound)\r+ declaration/var-def/type-def/macro-def\r+ assignment,assignment_expression\r+ func-ivk,postfix_expression\r+ compound,compound_statement\r+ gmr-statement,statement\r+ *cmd-statement\r#\r#\r#\r\r@ assignment\r# cmd的=后面是字符串,c语言的=后面是运行操作。\r# "[[:alnum:]_]*=(",var=(1 2 3)和var=(int*)ptr;,chk env name,在lxr中返回assign_quote,在gmr中对这个token之后的token解析,来设置assign的类型。(env_arr,var)\r# "[[:alnum:]_]*=[^\ ]",如果=之前为env,使用cmd的assign。如果为dvar或external-symbol,使用lang-assign,=及后面的字符unput,当前word为T_VAR。\r# 含"()"类型转换的assign时,"("的解析,如包含T_WORD,并且是变量type类型时,设置convert的state,其它的设置subscript。\r# 含xxx.xxx的submember的assign,token在gmr中组织为语句。\r#\r\r@ global\r# global的初始化,在init()或模块文件名同名的函数中初始化。\r#\r\r@ env与var\r# env看成是字符串类型的var。使用$envar为const的字符串,使用@envar为字符串的ptr,@envar与var一样使用\r\r@ 函数参数\r# cmd-style的调用,对于c-func,进行类型转换\r# 参数定义为型参,同时以$n访问参数字符串\r# 对于参数定义个数之外的,以$n访问。\r# 函数调用时"($@)"将参数"duplicate"到调用函数的参数区。\r\r\r@ 根据if/for语句,浏览expr和statement的定义。\r# expr\r# statement,根据定义中包含';'的项,浏览statement定义。\r+ compound_statement\r+ expression_statement\r+ selection_statement,iteration_statement\r+ labeled_statement,jump_statement\r# declaration/declaration_specifiers\r+ storage_class_specifier(TYPEDEF,EXTERN,STATIC,AUTO,REGISTER)\r+ type_specifier(VOID,CHAR,SHORT,INT,LONG,FLOAT,DOUBLE,SIGNED,UNSIGNED,struct_or_union_specifier,enum_specifier,TYPE_NAME)\r+ type_qualifier(CONST,VOLATILE)\r# ()\r\r@\r# statement\r: labeled_statement\r| compound_statement\r| expression_statement\r| selection_statement\r| iteration_statement\r| jump_statement\r;\r# expression\r: assignment_expression\r| expression ',' assignment_expression\r;\r# primary_expression\r: IDENTIFIER\r| CONSTANT\r| STRING_LITERAL\r| '(' expression ')'\r;\rpostfix_expression\r: primary_expression\r| postfix_expression '[' expression ']'\r| postfix_expression '(' ')'\r| postfix_expression '(' argument_expression_list ')'\r| postfix_expression '.' IDENTIFIER\r| postfix_expression PTR_OP IDENTIFIER\r| postfix_expression INC_OP\r| postfix_expression DEC_OP\r;\r\r\r\r \r\r