我想在Java中创建一个简单的解析器,用于像伪语言(保持僵化)的"伪代码".一个示例伪代码是 -
//This is a comment
$x1 = readint
$x2 = readint
$dx = $x2 - $x1
#f = $dx / 2
if ($dx > 0)
{
loop while(#f > 1)
{
print(#f)
#f = #f / 2
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,上面的代码是严格的,在一行上不能有多个语句,整数以$开头,浮点数以#开头等.
要解析这样的代码,首先我可以使用StringTokenizer,然后使用正则表达式来匹配整数变量,浮点变量或关键字.
这种做法好吗?对于循环语句,我如何存储表达式,以便我不必在每次迭代中进行标记化?
我可以考虑将表达式(如#f = #f/2)转换为抛光表示法,然后将其存储在堆栈中.在每次迭代中,在弹出操作数时,我可以替换每个变量的值.但这足够有效吗?
提前感谢,任何建议.
可以说我有这3个(小)python文件 -
a.py
myvar = 'a'
Run Code Online (Sandbox Code Playgroud)
b.py
import a
import c
myvar = 'b'
c.pr()
Run Code Online (Sandbox Code Playgroud)
c.py
from a import myvar
def pr():
print myvar
Run Code Online (Sandbox Code Playgroud)
现在,如果我执行,b.py我得到输出
a
Run Code Online (Sandbox Code Playgroud)
但我真的希望输出为
b
Run Code Online (Sandbox Code Playgroud)
所以请告诉我如何重组/修改程序,以便为模块范围 myvar分配不同的值.
基本上我有兴趣知道你走了多远,以确保您的用户获得最佳的应用程序.
int和使用short或int8_t.它会真的有用吗?或者它会更令人头痛?union哪些有助于降低内存使用量?我相信还有更重要的一点缺失.任何其他已知或本土的方式来增加记忆和时间表现是受欢迎的.
我正在制作一种基于命令的应用程序来绘制几何图形.因此,如果用户输入的内容类似于RECT 100, 50, 200, 120我在绘图面板上的指定位置绘制矩形.
所以对于这个我需要映射RECT到g.drawRect(100, 50, 200, 120);和所有这些类似的功能来绘制几何图形.
我将使用哈希映射进行映射,但我不知道如何在java中构建函数数组.在C++中,我已经做到了这一点.
键可以是'RECT',值可以是索引的偏移量.
请告诉我如何索引这些功能.或者还有更好的方法来解决主要问题吗?
f1: f1.cpp f.h
g++ -c -Wall -g f1.cpp
f2: f2.cpp f.h
g++ -c -Wall -g f.cpp
Run Code Online (Sandbox Code Playgroud)
这个makefile不会编译f2.cpp为f2.o
它只编译第一个文件,知道为什么吗?
这是头文件代码stack.h:
#include <iostream>
using namespace std;
//template <class T> struct stackNode;
//template <class T>
struct stackNode {
int item;
stackNode *Next;
stackNode *Prev;
//stackNode *Temp;
};
class stackClass {
public:
stackClass();
stackClass(const stackClass &right);
~stackClass();
stackClass &operator=(const stackClass &right);
int counter;
int StackIsEmpty(void);
//stackNode *origptr;
void push( int item, bool &success);
int pop(void);
int GetStackTop(void);
protected:
stackNode *GetStackTopPtr(void);
private:
stackNode *Top;
stackNode *Current;
//stackNode *origptr;
//stackNode<T> *Next;
};
Run Code Online (Sandbox Code Playgroud)
这是实现文件stack.cpp:
#include "stack.h"
//constructor
stackClass::stackClass(){
Top = NULL;
int counter = 0; …Run Code Online (Sandbox Code Playgroud) 我想比较两个落在[0.0,1.0]的双打.
我的功能(取自/sf/answers/1213901/) -
inline bool isEqual(double x, double y)
{
const double epsilon = 0.000001;
return fabs(x - y) < epsilon;
}
Run Code Online (Sandbox Code Playgroud)
用法-
cerr << isEqual(1.000001, 1.000002) << endl;
cerr << isEqual(1.000010, 1.000020) << endl;
Run Code Online (Sandbox Code Playgroud)
输出是 -
0
0
Run Code Online (Sandbox Code Playgroud)
而我期待第一个true,第二个false.请告诉我哪里出错了以及如何解决?