首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >帮助解析S-Expression

帮助解析S-Expression
EN

Stack Overflow用户
提问于 2011-05-29 09:57:29
回答 3查看 682关注 0票数 0

我正在试着做一个简单的绘图程序,可以读入translate (rect 10 10 10 10) 50 50。我尝试做的是拆分它,以便50 50translate一起使用,而rect保留所有的10

这是一个PostScript填充。我听说过哈希表和堆栈,但我不确定如何使用它们。我已经做了所有其他的事情(e.x。形状的所有计算)。我只是不明白如何解析这些行,以便我可以获得指向正确变量的数字。

EN

回答 3

Stack Overflow用户

发布于 2011-05-29 10:05:34

您的示例看起来像一个Lisp s-expression,因此尝试搜索"s-expression parser“。出现了一些点击率。

如果你想“大干一场”,你可以把你的shape例程实现为C++类,使用SWIG将它们暴露给GNU Guile,然后用Scheme编写你的应用程序。不过,这可能不是您想要的。:-)

票数 1
EN

Stack Overflow用户

发布于 2011-05-29 10:25:51

好吧,这可能有点老套,但它很简单,而且没有更快的了。

代码语言:javascript
复制
void scanWhite(char*& p){
  while(*p==' ') p++;
}

bool seeInt(char*& p, int& num){
  scanWhite(p);
  char* p1 = p;
  bool bNegative = false;
  if (*p=='-'){bNegative = true; p++;)
  if (!isdigit(*p){p = p1; return false;}
  num = 0;
  while(isdigit(*p)){
    num *= 10;
    num += (*p - '0');
    p++;
  }
  if (bNegative) num = - num;
  return true;
}

bool seeWord(char*& p, char* word){
  scanWhite(p);
  int len = strlen(word);
  if (strncmp(p, word, len)==0 && !isalphanumeric(p[len])){
    p += len;
    return true;
  }
  else return false;
}

bool seeChar(char*& p, char c){
  scanWhite(p);
  if (*p != c) return false;
  p++;
  return true;
}

bool parseTranslateRect(char*& p
  , int& x0, int& y0, int& x1, int& y1
  , int& dx, int& dy
  )
{
  if (!seeChar(p, '(')) return false;
  if (!seeWord(p, "translate")) return false;
  if (!seeChar(p, '(')) return false;
  if (!seeWord(p, "rect")) return false;
  if (!seeInt(p, &x0)) return false;
  if (!seeInt(p, &y0)) return false;
  if (!seeInt(p, &x1)) return false;
  if (!seeInt(p, &y1)) return false;
  if (!seeChar(p, ')')) return false;
  if (!seeInt(p, &dx)) return false;
  if (!seeInt(p, &dy)) return false;
  if (!seeChar(p, ')')) return false;
  return true;
}

如果你有许多"(translate (rect ...)“的副本,只需一遍又一遍地调用解析例程,直到它返回false。

票数 0
EN

Stack Overflow用户

发布于 2011-06-01 10:03:01

下面是如何使用AXE library编写这个C++解析器

代码语言:javascript
复制
Rect r;
auto rect = "(rect " 
    & r_decimal(r.left) & space 
    & r_decimal(r.top) & space
    & r_decimal(r.right) & space
    & r_decimal(r.bottom) & space
    & ')';

Point t;
auto translate = "translate " & rect 
    & space & r_decimal(t.x) 
    & space & r_decimal(t.y);
// test it
std::string str("translate (rect 10 10 10 10) 50 50");
auto match = translate(str.begin(), str.end());

它将解析PS文件中的单个转换语句。如果你需要解析所有的翻译语句,并且不想为postscript格式编写一个完整的解析器,你可以使用*r_find(translate)规则来跳过你不关心的输入。r_find(R)规则搜索输入,直到找到规则R。现在这很容易,而且它还会生成非常快的代码,可能比用"if"-s和"else"-s手写的代码要快。

免责声明:我不会测试上面的代码,所以可能会出现一些小错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6165509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档