- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试将浮点功能添加到这个我用 C 语言编写的简单词法分析器中,用于 C(除其他外)。我对此有一些想法,但它们都是不完整的解决方案,主要涉及将 if 语句添加到 Parse 整数文字中,但由于 while 语句,它仍然会停止并将句点计为句点。我考虑过在那个 while 语句中添加一个 OR,但我不完全确定如何指定它只是一个句点。这是代码:
/* front.c */
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <conio.h>
/*Global Declarations */
/*variables*/
int charClass;
char lexeme [100];
char nextChar;
int lexLen;
int token;
int nextToken;
FILE *in_fp, *fopen();
/*function declarations*/
void addChar();
void getChar();
void getNonBlank();
int lex();
/*Character classes */
#define LETTER 0
#define DIGIT 1
#define UNKNOWN 99
/*token codes*/
#define INT_LIT 10
#define FLOAT
#define IDENT 11
#define ASSIGN_OP 20
#define ADD_OP 21
#define SUB_OP 22
#define MULT_OP 23
#define DIV_OP 24
#define LEFT_PAREN 25
#define RIGHT_PAREN 26
#define MOD_OP 27
#define SEMICOL 28
#define COMMA 29
#define EXCLAMATION_MARK 30
#define AT_SIGN 31
#define POUND_SIGN 32
#define DOLLAR_SIGN 33
#define CARAT_SIGN 34
#define AMPERSAND 35
#define PERIOD_MARK 36
#define LESSTHAN_SIGN 37
#define GREATERTHAN_SIGN 38
#define QUESTION_MARK 39
#define LEFT_SQUAREBRACKET 40
#define RIGHT_SQUAREBRACKET 41
#define LEFT_CURLYBRACKET 42
#define RIGHT_CURLYBRACKET 43
#define BACKSLASH 44
#define VERTICALBAR 45
#define SINGLE_QUOTE 46
#define DOUBLE_QUOTE 47
#define COLON 48
#define UNDERSCORE 49
#define TILDE 50
#define GRAVE_ACCENT 51
/*********************/
/*main driver */
main()
{
/*Open the input data file and process its contents*/
if ((in_fp = fopen("front.in", "r")) == NULL)
printf("ERROR - cannot open front.in \n");
else
{
getChar();
do
{
lex();
} while (nextToken != EOF);
}
}
/***************************/
/*lookup - a function to lookup operators and parentheses
and return the token */
int lookup(char ch)
{
switch (ch)
{
case '=':
addChar();
nextToken = ASSIGN_OP
break;
case '(':
addChar();
nextToken = LEFT_PAREN;
break;
case ')':
addChar();
nextToken = RIGHT_PAREN;
break;
case '+':
addChar();
nextToken = ADD_OP;
break;
case '-':
addChar();
nextToken = SUB_OP;
break;
case '*':
addChar();
nextToken = MULT_OP;
break;
case '/':
addChar();
nextToken = DIV_OP;
break;
case '%':
addChar();
nextToken = MOD_OP;
break;
case ';':
addChar();
nextToken = SEMICOL;
break;
case ':':
addChar();
nextToken = COLON;
break;
case '"':
addChar();
nextToken = DOUBLE_QUOTE;
break;
case ',':
addChar();
nextToken = COMMA;
break;
case '.':
addChar();
nextToken = PERIOD_MARK;
break;
case '!':
addChar();
nextToken = EXCLAMATION_MARK;
break;
case '@':
addChar();
nextToken = AT_SIGN;
break;
case '#':
addChar();
nextToken = POUND_SIGN;
break;
case '$':
addChar();
nextToken = DOLLAR_SIGN;
break;
case '^':
addChar();
nextToken = CARAT_SIGN;
break;
case '&':
addChar();
nextToken = AMPERSAND;
break;
case '<':
addChar();
nextToken = LESSTHAN_SIGN;
break;
case '>':
addChar();
nextToken = GREATERTHAN_SIGN;
break;
case '?':
addChar();
nextToken = QUESTION_MARK;
break;
case '[':
addChar();
nextToken = LEFT_SQUAREBRACKET;
break;
case ']':
addChar();
nextToken = RIGHT_SQUAREBRACKET;
break;
case '{':
addChar();
nextToken = LEFT_CURLYBRACKET;
break;
case '}':
addChar();
nextToken = RIGHT_CURLYBRACKET;
break;
case '\'':
addChar();
nextToken = SINGLE_QUOTE;
break;*
case '|':
addChar();
nextToken = VERTICALBAR;
break;
case '_':
addChar();
nextToken = UNDERSCORE;
break;
case '~':
addChar();
nextToken = TILDE;
break;
case '`':
addChar();
nextToken = GRAVE_ACCENT;
break;
case '\\':
addChar();
nextToken = BACKSLASH;
break;
default:
addChar();
nextToken = EOF;
break;
}
return nextToken;
}
/*****************************/
/* addChar = a function to add nextChar to lexeme */
void addChar()
{
if (lexLen <= 98)
{
lexeme[lexLen++] = nextChar;
lexeme[lexLen] = 0;
}
else
printf("Error - lexeme is too long \n");
}
/**********************************/
/* getChar- a function to get the next character of
input and determine its character class */
void getChar()
{
if ((nextChar = getc(in_fp)) != EOF)
{
if (isalpha(nextChar))
charClass = LETTER;
else if (isdigit(nextChar))
charClass = DIGIT;
else charClass = UNKNOWN;
}
else
charClass = EOF;
}
/********************************************/
/* getNonBlank - a function to call getChar until it
returns a non-whitespace character */
void getNonBlank()
{
while (isspace(nextChar))
getChar();
}
/*******************************/
/* lex - a simple lexical analyzer for arithmetic
expressions */
int lex()
{
lexLen = 0;
getNonBlank();
switch (charClass)
{
/*Parse identifiers */
case LETTER:
addChar();
getChar();
while (charClass == LETTER || charClass == DIGIT)
{
addChar();
getChar();
}
nextToken = IDENT;
break;
/*Parse integer literals and ?Floats?*/
case DIGIT:
addChar();
getChar();
while (charClass == DIGIT)
{
addChar();
getChar();
}
nextToken = INT_LIT;
break;
/*Parentheses and operators*/
case UNKNOWN:
lookup(nextChar);
getChar();
break;
/*EOF*/
case EOF:
nextToken = EOF;
lexeme[0] = 'E';
lexeme[1] = 'O';
lexeme[2] = 'F';
lexeme[3] = 0;
break;
}/*End of switch*/
printf("Next token is: %d, Next lexeme is %s\n",
nextToken, lexeme);
return nextToken;
} /*End of function lex*/
我在想,也许如果我在 while 语句中使用像“charClass.ch == '.'”这样的东西作为“charClass == DIGIT”的扩展,通过 || (或),但我认为我可能会与另一种语言混淆或做错了。我可能不是,但目前很难正确测试这个程序。
这是我认为需要更改以获得 float 的具体部分:
/*Parse integer literals and ?Floats?*/
case DIGIT:
addChar();
getChar();
while (charClass == DIGIT)
{
addChar();
getChar();
}
nextToken = INT_LIT;
break;
最佳答案
/*Parse integer literals and ?Floats?*/
case DIGIT:
addChar();
getChar();
while (charClass == DIGIT)
{
addChar();
getChar();
}
此时您已经知道nextChar
是什么了。如果它是一个点,请编写更多代码来使用它和所有后续数字并将 nextToken
设置为 FLOAT_LIT。
否则会落入此:
nextToken = INT_LIT;
break;
关于c - 如何向 C 词法分析器添加浮点解析功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22623796/
我创建了一个用户可以添加测试的字段。这一切运行顺利我只希望当用户点击(添加另一个测试)然后上一个(添加另一个测试)删除并且这个显示在新字段中。 所有运行良好的唯一问题是点击(添加另一个字段)之前添加另
String[] option = {"Adlawan", "Angeles", "Arreza", "Benenoso", "Bermas", "Brebant
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我正在努力将 jQuery 滚动功能添加到 nav-tab (Bootstrap 3)。我希望用户能够选择他们想要的选项卡,并在选项卡内容中有一个可以平滑滚动到 anchor 的链接。这是我的代码,可
我正在尝试在用户登录后再添加 2 个 ui 选项卡。首先,我尝试做一个之后。 $('#slideshow').tabs('remove', '4'); $("#slideshow ul li:last
我有一个包含选择元素的表单,我想通过选择添加和删除其中一些元素。这是html代码(这里也有jsfiddle http://jsfiddle.net/txhajy2w/):
正在写这个: view.backgroundColor = UIColor.white.withAlphaComponent(0.9) 等同于: view.backgroundColor = UICo
好的,如果其中有任何信息,我想将这些列添加到一起。所以说我有 账户 1 2 3 . 有 4 个帐户空间,但只有 3 个帐户。我如何创建 java 脚本来添加它。 最佳答案 Live Example H
我想知道是否有一种有效的预制算法来确定一组数字的和/差是否可以等于不同的数字。示例: 5、8、10、2,使用 + 或 - 等于 9。5 - 8 = -3 + 10 = 7 + 2 = 9 如果有一个预
我似乎有一个卡住的 git repo。它卡在所有基本的添加、提交命令上,git push 返回所有内容为最新的。 从其他帖子我已经完成了 git gc 和 git fsck/ 我认为基本的调试步骤是
我的 Oracle SQL 查询如下- Q1- select hca.account_number, hca.attribute3, SUM(rcl.extended_amou
我正在阅读 http://developer.apple.com/iphone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingG
我正在尝试添加一个“加载更多”按钮并限制下面的结果,这样投资组合页面中就不会同时加载 1000 个内容,如下所示:http://typesetdesign.com/portfolio/ 我对 PHP
我遇到这个问题,我添加了 8 个文本框,它工作正常,但是当我添加更多文本框(如 16 个文本框)时,它不会添加最后一个文本框。有人遇到过这个问题吗?提前致谢。 Live Link: JAVASCRIP
add/remove clone first row default not delete 添加/删除克隆第一行默认不删除&并获取正确的SrNo(例如:添加3行并在看到问题后删除SrNo.2)
我编码this ,但删除按钮不起作用。我在控制台中没有任何错误.. var counter = 0; var dataList = document.getElementById('materi
我有一个类似数组的对象: [1:数组[10]、2:数组[2]、3:数组[2]、4:数组[2]、5:数组[3]、6:数组[1]] 我正在尝试删除前两个元素,执行一些操作,然后将它们再次插入到同一位置。
使用的 Delphi 版本:2007 你好, 我有一个 Tecord 数组 TInfo = Record Name : String; Price : Integer; end; var Info
我使用了基本的 gridster 代码,然后我声明了通过按钮添加和删除小部件的函数它工作正常但是当我将调整大小功能添加到上面的代码中时,它都不起作用(我的意思是调整大小,添加和删除小部件) 我的js代
title 323 323 323 title 323 323 323 title 323 323 323 JS $(document).keydown(function(e){
我是一名优秀的程序员,十分优秀!