声明:这个代码几乎完全就是照抄hyh学长的!!!

有什么问题我会删掉这篇的emm

当初面试的时候我的方向就是编译原理...然后学长发了个1400+的代码实现一个简化的c编译器...没看懂qaq

感觉很多知识还是很缺失的emm(当初连高维数组是怎么存的都不知道啊!指针几乎完全不会用啊!更别说什么函数怎么层层递归 变量怎么层层声明的)现在总算是懂了JSON这个呀越发觉得这个代码写得很美妙啊hhh

先发一下题面:

题意:

一段JSON结构的代码

一种是 字符串  名称-键值 “ ” : “ ”

一种是 对象(有对象名){}

对象里面可以是多个字符串,或者是嵌套的对象。

题解:

应该算是很典型的编译原理类题目吧

这个层层嵌套的对象怎么实现呢?其实是定义一个object类型,然后用每个对象用指针指向,一层层嵌套。有这个大概的想法可能不难,难点应该是在于这个代码怎么实现。

这个也是提醒我打之前要想好每个函数的作用,要准确清晰,不然会越打越混乱,无限debug。

 #include<bits/stdc++.h>
using namespace std; string json;
string::iterator ptr; struct obj
{
map<string, obj *> child; string value; bool is_obj; obj() : is_obj(true) {}
obj(const string &value) : value(value),is_obj(false) {} //初始化,调用obj(value)时的赋值
}; void skip_non_blank_char()
{
while(isspace(*ptr)) ptr++;
//isspace(char) distinguish空格/回车/制表符等
} char peek_char()
{
skip_non_blank_char();
return *ptr;
} char next_char()
{
skip_non_blank_char();
return *ptr++;
//*ptr++:是先取出*ptr的值,再使ptr加1
} string parse_string()
{
next_char(); // "
char c;
bool escape = ; //转义字符 escape char
string token;
while(c = next_char(),)
{
if(!escape)
{
if(c == '"') break;
if(c == '\\')
{
escape = true;
continue;
}
}
else escape = ;
token += c;
}
return token;
} obj* parse_value()
{
if (peek_char() == '{') // an object
{
next_char(); obj* res = new obj(); while()
{
if (peek_char() != '"') break;
string key = parse_string();
next_char(); // :
obj* val = parse_value();
res->child[key] = val;
if(peek_char() == '}') break;
next_char(); // ,
} next_char(); // }
return res;
}
else
{
obj* res = new obj(parse_string());
return res;
}
} int main()
{
// freopen("a.in","r",stdin);
int n,q;
string line;
scanf("%d%d",&n,&q);
getline(cin,line);
json.clear();
for (int i = ; i <= n; i++)
{
getline(cin,line);
json+=line;
}
ptr = json.begin();
obj* root = parse_value(); while (q--)
{
getline(cin,line); obj* cur = root;
string t;
t.clear();
bool not_found = ;
for (int i = ; i <= line.size() ; i++)
{
if (i == line.size() || line[i] == '.')
{
if (!cur->child.count(t))
{
not_found = ;
break;
}
cur = cur->child[t];
t.clear();
}
else t += line[i];
} if (not_found) cout << "NOTEXIST" << endl;
else if (cur->is_obj) cout << "OBJECT" << endl;
else cout << "STRING " << cur->value << endl; }
return ;
}

[csp-201709-3]JSON查询-编译原理的更多相关文章

  1. CCF CSP 201709-3 JSON查询

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201709-3 JSON查询 问题描述 JSON (JavaScript Object Not ...

  2. Elasticsearch由浅入深(六)批量操作:mget批量查询、bulk批量增删改、路由原理、增删改内部原理、document查询内部原理、bulk api的奇特json格式

    mget批量查询 批量查询的好处就是一条一条的查询,比如说要查询100条数据,那么就要发送100次网络请求,这个开销还是很大的如果进行批量查询的话,查询100条数据,就只要发送1次网络请求,网络请求的 ...

  3. Compiler Theory(编译原理)、词法/语法/AST/中间代码优化在Webshell检测上的应用

    catalog . 引论 . 构建一个编译器的相关科学 . 程序设计语言基础 . 一个简单的语法制导翻译器 . 简单表达式的翻译器(源代码示例) . 词法分析 . 生成中间代码 . 词法分析器的实现 ...

  4. Java编译原理

    http://wenku.baidu.com/view/f9b1734b87c24028915fc3a3.html Java编译原理 1. 关于动态加载机制 学习Java比C++更容易理解OOP的思想 ...

  5. JS 实现Json查询的方法实例

    其实很简单,我这部分代码,前一部分是简单的实现如何使用JS写模板,第二个就是具体的实现了JSON查询的一个扩展. 以后查询Json就有了利器了. 代码如下: /*         * 定义模板函数   ...

  6. Stanford公开课《编译原理》学习笔记(1~4课)

    目录 一. 编译的基本流程 二. Lexical Analysis(词法分析阶段) 2.1 Lexical Specification(分词原则) 2.2 Finite Automata (典型分词算 ...

  7. Java 实现《编译原理》简单-语法分析功能-LL(1)文法 - 程序解析

    Java 实现<编译原理>简单-语法分析功能-LL(1)文法 - 程序解析 编译原理学习,语法分析程序设计 (一)要求及功能 已知 LL(1) 文法为: G'[E]: E→TE' E'→+ ...

  8. [Vue源码]一起来学Vue模板编译原理(一)-Template生成AST

    本文我们一起通过学习Vue模板编译原理(一)-Template生成AST来分析Vue源码.预计接下来会围绕Vue源码来整理一些文章,如下. 一起来学Vue双向绑定原理-数据劫持和发布订阅 一起来学Vu ...

  9. 编译原理--05 用C++手撕PL/0

    前言 目录 01 文法和语言.词法分析复习 02 自顶向下.自底向上的LR分析复习 03 语法制导翻译和中间代码生成复习 04 符号表.运行时存储组织和代码优化复习 05 用C++手撕PL/0 在之前 ...

随机推荐

  1. lintcode-205-区间最小数

    205-区间最小数 给定一个整数数组(下标由 0 到 n-1,其中 n 表示数组的规模),以及一个查询列表.每一个查询列表有两个整数 [start, end]. 对于每个查询,计算出数组中从下标 st ...

  2. TCP系列42—拥塞控制—5、Linux中的慢启动和拥塞避免(二)

    在本篇中我们继续上一篇文章wireshark的示例讲解,上一篇介绍了一个综合示例后,本篇介绍一些简单的示例,在读本篇前建议先把上一篇读完,为了节省篇幅,本篇只针对一些特殊的场景点报文进行讲解,不会像上 ...

  3. PHP中的构造方法和析构方法

    构造方法(_ _construct): 构造方法,是一个特殊的方法: 1,名字是固定的:_ _construct: 2,该方法通常都不要我们自己调用,而是在new一个对象的时候会自动调用. 3,该方法 ...

  4. 第99天:CSS3中透视perspective

    CSS3中透视perspective 透视原理: 近大远小 . 浏览器透视:把近大远小的所有图像,透视在屏幕上. 理解浏览器的坐标系:浏览器平面为 Z=0的平面,坐标原点默认为图片的中心,可以通过更改 ...

  5. 第89天:HTML5中 访问历史、全屏和网页存储API

    一.访问历史 API 通过history对象实现前进.后退和刷新之类的操作 history新增的两个方法history.replaceState()和history.pushState()方法属于HT ...

  6. 第87天:HTML5中新选择器querySelector的使用

    一.HTML5新选择器 1.document.querySelector("selector");selector:根据CSS选择器返回第一个匹配到的元素,如果没有匹配到,则返回n ...

  7. scrollTop()案例

    设置 <div> 元素中滚动条的垂直偏移: 定义和用法 scrollTop() 方法返回或设置匹配元素的滚动条的垂直位置. scroll top offset 指的是滚动条相对于其顶部的偏 ...

  8. 获取和验证Windows AD域的用户信息

    1.获取windows AD域用户信息,首先需要有一个ad域管理员权限的账号,用这个账号连接ad域,获取所有域用户信息 用LdapContext,它继承自DirContext public Objec ...

  9. NOIP模拟

    1.要选一个{1,2,...n}的子集使得假如a和b在所选集合里且(a+b)/2∈{1,2,...n}那么(a+b)/2也在所选集合里 f[i]=2*f[i-1]-f[i-2]+g[i] g[n]:选 ...

  10. sysbench - 单组件式测试工具

    1 安装 > ./configure --with-mysql-includes=/usr/local/mysql/include --with-mysql-libs=/usr/local/my ...