你现在位置:首页>技术论文>软件知识>正文
用有限状态机(FSM)解析option文件
日期:2008-5-19 1:00:52 来源:本站整理  
点击: 作者:
点击【】放大字体.

目标

W1WW_P4LCJS_COM-PLC-技.术_网

WWW_PL※CJS_COM-PLC-技.术_网

实现对option文件的解析,从中找出多组“选项”和“选项的值”,以替换选项的预设值。很多程序在运行初期,可以通过该option文件获取用户期望的运行时间配置。因此对这样接口的设计是有意义的。
WWW.PLCJS.COM——可编程控制器技术门户

WWW_P※LCJS_COM-PLC-)技.术_网

Option文件规则:

WWW_PL※CJS_COM-PLC-技.术_网

WW.W_PLCJS_COM-PLC-技.术_网

Option和对应值应当在一行上出现, 并以空格格开;#号为注释号,其一行上后续的所有字符都被忽略
W1WW_P4LCJS_COM-PLC-技.术_网

WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

State (状态):

WWW_PLC※JS_COM-PmLC-技.术_网

WWW_PLC※JS_COM-PmLC-技.术_网

INIT: 初始化状态
plcjs.技.术_网

INVA: 注释状态
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

EFO: OPTION输入状态
WWW_PLC※JS_COM-PmLC-技.术_网

EFV: VAL输入状态
WWW_P※LCJS_CO※M-PLC-技-.术_网

P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

Action (动作):

WW.W_PLC※JS_C,OM-PL,C-技.术_网

WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

ANC : acquire next character
WW.W_PLC※JS_C,OM-PL,C-技.术_网

OP: option parse
P.L.C.技.术.网——可编程控制器技术门户

plcjs.技.术_网

Transition table (状态迁移表):

WWW_P※LCJS_COM-PLC-)技.术_网

WWW_PLC※JS_COM-PmLC-技.术_网

 
WW.W_PLC※JS_C,OM-PL,C-技.术_网

WWW.PLCJS.COM——可编程控制器技术门户

注释状态
WWW_PLCJS@_COM%-PLC-技.术_网

INVA
W1WW_P4LCJS_COM-PLC-技.术_网

WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

有效输入状态
WWW_PLC※JS_COM-PmLC-技.术_网

EFO
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

有效输入状态
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

EFV
plcjs.技.术_网

——可——编——程——控-制-器-技——术——门——户

初始状态
WWcW_PLCJS_COM-PLC-技.术_网

INIT
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

#
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

WW.W_PLCJS_COM-PLC-技.术_网

ANC/INVA
——可——编——程——控-制-器-技——术——门——户

WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

OP, ANC/INVA
P.L.C.技.术.网——可编程控制器技术门户

WWW_PL※CJS_COM-PLC-技.术_网

OP, ANC/INVA
WWW_PLCJS_COM-PLC-技.术_网

——可——编——程——控-制-器-技——术——门——户

ANC/INVA
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

WWW_P※LCJS_CO※M-PLC-技-.术_网

\n
WWcW_PLCJS_COM-PLC-技.术_网

WWW_P※LCJS_COM-PLC-)技.术_网

Line++,ANC/INIT
WWW_P※LCJS_COM-PLC-)技.术_网

WWW_P※LCJS_COM-PLC-)技.术_网

OP, ANC/INIT
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

WWW_PL※CJS_COM-PLC-技.术_网

OP, ANC/INIT
WW.W_PLCJS_COM-PLC-技.术_网

WWW_PL※CJS_COM-PLC-技.术_网

Line++,ANC/INIT
P.L.C.技.术.网——可编程控制器技术门户

WW.W_PLCJS_COM-PLC-技.术_网

a-z A-Z 0-9
WWW.PLCJS.COM——可编程控制器技术门户

WWW_PLCJS@_COM%-PLC-技.术_网

ANC/INVA
WWW_P※LCJS_COM-PLC-)技.术_网

WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

ANC/EFO
W1WW_P4LCJS_COM-PLC-技.术_网

WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

ANC/EFV
WW.W_PLCJS_COM-PLC-技.术_网

plcjs.技.术_网

ANC/EFO
WWW_P※LCJS_CO※M-PLC-技-.术_网

WWcW_PLCJS_COM-PLC-技.术_网

EOF
W1WW_P4LCJS_COM-PLC-技.术_网

WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

RET/INIT
WWcW_PLCJS_COM-PLC-技.术_网

WWW_PLCJS@_COM%-PLC-技.术_网

OP/INIT
WWW_P※LCJS_CO※M-PLC-技-.术_网

P.L.C.技.术.网——可编程控制器技术门户

OP/INIT
WWW_PL※CJS_COM-PLC-技.术_网

WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

ANC/INIT
WWcW_PLCJS_COM-PLC-技.术_网

——可——编——程——控-制-器-技——术——门——户

Other
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

plcjs.技.术_网

ANC/INVA
plcjs.技.术_网

WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

ANC/INIT
WW.W_PLC※JS_C,OM-PL,C-技.术_网

WWW_P※LCJS_COM-PLC-)技.术_网

ANC/INIT
WWW_PLC※JS_COM-PmLC-技.术_网

WWW_PL※CJS_COM-PLC-技.术_网

ANC/INIT
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

WWW_PL※CJS_COM-PLC-技.术_网

SPACE
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

W1WW_P4LCJS_COM-PLC-技.术_网

ANC/INVA
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

WWW_P※LCJS_CO※M-PLC-技-.术_网

ANC/EFV
WW.W_PLCJS_COM-PLC-技.术_网

WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

OP, ANC/EFV
——可——编——程——控-制-器-技——术——门——户

WWcW_PLCJS_COM-PLC-技.术_网

ANC/INIT
WWW_PL※CJS_COM-PLC-技.术_网

WWW_P※LCJS_COM-PLC-)技.术_网

- 横轴为【状态】 - 纵轴为【事件】交会点为【一个或多个动作/下一状态】
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

 
WW.W_PLCJS_COM-PLC-技.术_网

代码如下:
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

 
WWW_PL※CJS_COM-PLC-技.术_网

WWW_P※LCJS_COM-PLC-)技.术_网

P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

#include <stdio.h>
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

#include <string.h>
W1WW_P4LCJS_COM-PLC-技.术_网

int get_option(char * option, int * val, FILE * fd, int * anno_lines);
WWW_PLCJS@_COM%-PLC-技.术_网

int main(int argc, char * argv[])
——可——编——程——控-制-器-技——术——门——户

{
WWW_PLCJS@_COM%-PLC-技.术_网

 FILE * fd;
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

 char option[24 + 1];
WWW_P※LCJS_CO※M-PLC-技-.术_网

 int val;
WWW_P※LCJS_COM-PLC-)技.术_网

 int anno;
WWW.PLCJS.COM——可编程控制器技术门户

 int cnt = 0;
WWW_PL※CJS_COM-PLC-技.术_网

 fd = fopen("optionfile", "r");
WWW_PL※CJS_COM-PLC-技.术_网

 while(get_option(option, &val, fd, &anno) != 1)
WWW_PLC※JS_COM-PmLC-技.术_网

 {
WWcW_PLCJS_COM-PLC-技.术_网

  printf("[%2d#] %s:%d\n", cnt++, option, val);
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

 }
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

 return 0;
WWW.PLCJS.COM——可编程控制器技术门户

}
WWW_PLCJS_COM-PLC-技.术_网

typedef enum
P.L.C.技.术.网——可编程控制器技术门户

{
P.L.C.技.术.网——可编程控制器技术门户

 INIT,
WW.W_PLC※JS_C,OM-PL,C-技.术_网

 INVA,
WWW_PL※CJS_COM-PLC-技.术_网

 EFO,
WWcW_PLCJS_COM-PLC-技.术_网

 EFV
WW.W_PLC※JS_C,OM-PL,C-技.术_网

} parse_state_e;
WWW_PLCJS_COM-PLC-技.术_网

static parse_state_e state = INIT;
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

#define RET_OPTION \
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

do{ \
WWW_P※LCJS_COM-PLC-)技.术_网

 if(valptr == 0 || optionptr == 0) \
WW.W_PLCJS_COM-PLC-技.术_网

  return 1; \
WW.W_PLC※JS_C,OM-PL,C-技.术_网

 if(option != NULL) \
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

  strcpy(option, optionbuf); \
WW.W_PLCJS_COM-PLC-技.术_网

 if(val != NULL) \
WWW_PLC※JS_COM-PmLC-技.术_网

  * val = atoi(valbuf); \
WWW_P※LCJS_COM-PLC-)技.术_网

 if(anno_lines != NULL) \
WWW_PLCJS@_COM%-PLC-技.术_网

  * anno_lines = anno; \
WWW.PLCJS.COM——可编程控制器技术门户

 state = INIT; \
WWcW_PLCJS_COM-PLC-技.术_网

}while(0)
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

/******************************************************************************
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

Description: Get one option from file, if success returned.
WWcW_PLCJS_COM-PLC-技.术_网

Input:
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

Output:
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

Return Value: 0 success; 1 error; 2 success with end of file
WWW_PL※CJS_COM-PLC-技.术_网

*******************************************************************************/
WWW_P※LCJS_CO※M-PLC-技-.术_网

int get_option(char * option, int * val, FILE * fd, int * anno_lines)
WWW_PL※CJS_COM-PLC-技.术_网

{
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

 char ch;
WWW.PLCJS.COM——可编程控制器技术门户

 size_t size;
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

 char optionbuf[24 + 1];
WWW.PLCJS.COM——可编程控制器技术门户

 int optionptr = 0;
WWW_PL※CJS_COM-PLC-技.术_网

 char valbuf[12 + 1];
WW.W_PLC※JS_C,OM-PL,C-技.术_网

 int valptr = 0;
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

 int anno = 0;
WWW_PLC※JS_COM-PmLC-技.术_网

 state = INIT;
WWW_PLCJS_COM-PLC-技.术_网

 memset(&optionbuf, 0, 24);
WWcW_PLCJS_COM-PLC-技.术_网

 memset(&valbuf, 0, 12);
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

 
WWW_P※LCJS_CO※M-PLC-技-.术_网

 if(fd == NULL)
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

  return 1;
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

 while(1)
WW.W_PLCJS_COM-PLC-技.术_网

 {
WWW_PLCJS@_COM%-PLC-技.术_网

  size = fread(&ch, 1, 1, fd);
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

  //printf("ch: %c size: %d\n", ch, size);
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

  if(size != 1)
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

  {
WWW_PLC※JS_COM-PmLC-技.术_网

   if(feof(fd)) /*到达文件尾部*/
WW.W_PLCJS_COM-PLC-技.术_网

   {
WWW_P※LCJS_CO※M-PLC-技-.术_网

    if(state == INVA || state == INIT)
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

    {
W1WW_P4LCJS_COM-PLC-技.术_网

     return 1;
WWW_P※LCJS_COM-PLC-)技.术_网

    }
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

    if(state == EFO)
——可——编——程——控-制-器-技——术——门——户

     return 1;
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

    if(state == EFV)
WWW_PLCJS@_COM%-PLC-技.术_网

    {
WWcW_PLCJS_COM-PLC-技.术_网

     RET_OPTION;
WWcW_PLCJS_COM-PLC-技.术_网

     return 2;
WWW_PL※CJS_COM-PLC-技.术_网

    }
W1WW_P4LCJS_COM-PLC-技.术_网

   }
WW.W_PLCJS_COM-PLC-技.术_网

   return 1;
WWW_PLC※JS_COM-PmLC-技.术_网

  }
W1WW_P4LCJS_COM-PLC-技.术_网

  if(ch == #)
WWW_P※LCJS_CO※M-PLC-技-.术_网

  {
WWW_PLC※JS_COM-PmLC-技.术_网

   if(state == INVA || state == INIT)
WW.W_PLC※JS_C,OM-PL,C-技.术_网

   {
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

    state = INVA;
WWcW_PLCJS_COM-PLC-技.术_网

    continue;
W1WW_P4LCJS_COM-PLC-技.术_网

   }
WWW_PLC※JS_COM-PmLC-技.术_网

   if(state == EFO || state == EFV)
WWW_P※LCJS_CO※M-PLC-技-.术_网

   {
WWW_PLC※JS_COM-PmLC-技.术_网

    RET_OPTION;
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

    return 0;
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

   }
WWW_PLCJS@_COM%-PLC-技.术_网

  }
WWW_PLC※JS_COM-PmLC-技.术_网

  else if((ch >= a && ch <= z) || (ch >= A && ch <= Z) || (ch >= 0 && ch <= 9))
WWW_PLCJS_COM-PLC-技.术_网

  {
WWW_PLCJS@_COM%-PLC-技.术_网

   if(state == INVA)
WWW_PL※CJS_COM-PLC-技.术_网

    continue;
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

   if(state == INIT || state == EFO)
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

   {
W1WW_P4LCJS_COM-PLC-技.术_网

    state = EFO;
W1WW_P4LCJS_COM-PLC-技.术_网

    optionbuf[optionptr++] = ch;
WW.W_PLCJS_COM-PLC-技.术_网

    continue;
WW.W_PLCJS_COM-PLC-技.术_网

   }
WWW_P※LCJS_CO※M-PLC-技-.术_网

   if(state == EFV)
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

   {
WWW.PLCJS.COM——可编程控制器技术门户

    valbuf[valptr++] = ch;
WWW_PLCJS_COM-PLC-技.术_网

    continue;
plcjs.技.术_网

   }
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

  }
WWW.PLCJS.COM——可编程控制器技术门户

  else if(ch == )
W1WW_P4LCJS_COM-PLC-技.术_网

  {
WWW_PLCJS_COM-PLC-技.术_网

   if(state == INVA || state == INIT)
W1WW_P4LCJS_COM-PLC-技.术_网

    continue;
W1WW_P4LCJS_COM-PLC-技.术_网

   if(state == EFO)
WWW_PLC※JS_COM-PmLC-技.术_网

   {
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

    state = EFV;//可以用while循环去掉所有连续空格
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

   }
plcjs.技.术_网

   if(state == EFV)
WWW_P※LCJS_CO※M-PLC-技-.术_网

   {
P.L.C.技.术.网——可编程控制器技术门户

    if(valptr == 0) /* 前导空格,不意味结束 */
plcjs.技.术_网

     continue;
P.L.C.技.术.网——可编程控制器技术门户

    //OP
WW.W_PLCJS_COM-PLC-技.术_网

    RET_OPTION;
WWW_PLCJS@_COM%-PLC-技.术_网

    return 0;
WWW_P※LCJS_COM-PLC-)技.术_网

   }
P.L.C.技.术.网——可编程控制器技术门户

  }
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

  else if(ch == \n || ch == \r)
WWW.PLCJS.COM——可编程控制器技术门户

  {
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

   if(ch == \r)
WW.W_PLC※JS_C,OM-PL,C-技.术_网

    continue;
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

   if(state == INVA || state == INIT)
——可——编——程——控-制-器-技——术——门——户

   {
WWW_P※LCJS_CO※M-PLC-技-.术_网

    state = INIT;
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

    anno++;
WW.W_PLC※JS_C,OM-PL,C-技.术_网

    continue;
WWcW_PLCJS_COM-PLC-技.术_网

   }
WW.W_PLCJS_COM-PLC-技.术_网

   if(state == EFO)
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

    return 1;
WWW_PLCJS_COM-PLC-技.术_网

   if(state == EFV)
WWW_PLCJS_COM-PLC-技.术_网

   {
WWW_PLCJS_COM-PLC-技.术_网

    RET_OPTION;
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

    return 0;
WWW_PLCJS@_COM%-PLC-技.术_网

   }
WWW_PL※CJS_COM-PLC-技.术_网

  }
WWW_PLCJS@_COM%-PLC-技.术_网

  else
——可——编——程——控-制-器-技——术——门——户

  {
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

   return 1;
WWW_PLC※JS_COM-PmLC-技.术_网

  }
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

  return 1;
WWW_PLCJS_COM-PLC-技.术_网

 }
WWW_P※LCJS_CO※M-PLC-技-.术_网

}
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

plcjs.技.术_网

WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

option文件的例子:

本新闻共2页,当前在第11 2  
WW.W_PLCJS_COM-PLC-技.术_网

评论内容
载入中...
载入中...
P
L
C



|










|


P
L
C









·最新招聘信息
·最新求职信息
·推荐产品
·推荐厂商
·栏目热门排行
·站内热门排行