Массив констант

  • Автор темы Pegas
  • Дата начала
Статус
Закрыто для дальнейших ответов.
P

Pegas

Гость
#1
Здравствуйте! Проблема заключается в следующем: Нужно открыть файл, найти в нём все константы и сохранить их в таблицу констант (пишу компилятор для языка С). Как найти в тексте числа?
У меня есть предположение, что можно создать массив чисел от 0 до 9, а потом сравнивать каждый символ текста с элементами массива. Может кто-нибудь знает более оптимальное решение?
 
04.09.2006
2 566
2
#2
<!--QuoteBegin-Pegas+10:04:2007, 10:01 -->
<span class="vbquote">(Pegas @ 10:04:2007, 10:01 )</span><!--QuoteEBegin-->найти в нём все константы
[snapback]61926" rel="nofollow" target="_blank[/snapback]​
[/quote]
Что ты подразумеваешь под константами?
 
P

Pegas

Гость
#3
<!--QuoteBegin-European+10:04:2007, 10:11 -->
<span class="vbquote">(European @ 10:04:2007, 10:11 )</span><!--QuoteEBegin-->Что ты подразумеваешь под константами?
[snapback]61930" rel="nofollow" target="_blank[/snapback]​
[/quote]

числа типа integer, float и т.д.

Допусим есть в тексте программы выражение:

A = 123 + V;

Мне нужно выделить 123 и поместить это число в таблицу констант
 
04.09.2006
2 566
2
#4
Ну тут удобнее использовать стандартную библиотеку, в которой определены функции:
isdigit() - проверка цифр
isalpha() - проверка букв
isalnum() - проверка букв и цифр
Используя их совместно с алгоритмами find, find_first и find_if можно упростить задачу и сделать код ясным и понятным

<!--QuoteBegin-Pegas+10:04:2007, 10:01 -->
<span class="vbquote">(Pegas @ 10:04:2007, 10:01 )</span><!--QuoteEBegin-->Может кто-нибудь знает более оптимальное решение?
[snapback]61926" rel="nofollow" target="_blank[/snapback]​
[/quote]
Если надо пройти по всему файлу, то где здесь оптимизировать? Хотя я говорю только о работе с файлами, а не принципах работы компиляторов
 
P

Pegas

Гость
#5
<!--QuoteBegin-European+10:04:2007, 10:24 -->
<span class="vbquote">(European @ 10:04:2007, 10:24 )</span><!--QuoteEBegin-->isdigit() - проверка цифр
isalpha() - проверка букв
isalnum() - проверка букв и цифр
[snapback]61932" rel="nofollow" target="_blank[/snapback]​
[/quote]

Если можно, подскажите пожалуйста, в какой библиотеке находятся эти функции? Никогда раньше не приходилось использовать, и эта библиотека есть в Turbo C?
 
04.09.2006
2 566
2
#6
<!--QuoteBegin-Pegas+10:04:2007, 10:31 -->
<span class="vbquote">(Pegas @ 10:04:2007, 10:31 )</span><!--QuoteEBegin-->Если можно, подскажите пожалуйста, в какой библиотеке находятся эти функции?
[snapback]61934" rel="nofollow" target="_blank[/snapback]​
[/quote]
В стандартной библиотеке языка С++ (файл stlib.h в VS)
<!--QuoteBegin-Pegas+10:04:2007, 10:31 -->
<span class="vbquote">(Pegas @ 10:04:2007, 10:31 )</span><!--QuoteEBegin-->эта библиотека есть в Turbo C?
[snapback]61934" rel="nofollow" target="_blank[/snapback]​
[/quote]
Не знаю, но думаю что нет.
P.S.> А может ну его этот Turbo C? :)
 
P

Pegas

Гость
#7
<!--QuoteBegin-European+10:04:2007, 10:39 -->
<span class="vbquote">(European @ 10:04:2007, 10:39 )</span><!--QuoteEBegin-->P.S.> А может ну его этот Turbo C?
[snapback]61935" rel="nofollow" target="_blank[/snapback]​
[/quote]


Полностью согласен, но в универе компы допотопные и на них не запускаются проги с Visual St. Для запуска нужно установить саму VS. А вот простой досовский воспринимает как родного :) . А вобще мне больше нравится С#, я на нём уже пытался игрушку простую написать, довольно не плохой язык, так ладно что-то я увлёкся :) .

Если таких функций нет в Turbo C, тогда может что-нибудь ещё посоветуете?
 
04.09.2006
2 566
2
#8
<!--QuoteBegin-Pegas+10:04:2007, 10:57 -->
<span class="vbquote">(Pegas @ 10:04:2007, 10:57 )</span><!--QuoteEBegin-->но в универе компы допотопные и на них не запускаются проги с Visual St
[snapback]61938" rel="nofollow" target="_blank[/snapback]​
[/quote]
А какая Винда?

<!--QuoteBegin-Pegas+10:04:2007, 10:57 -->
<span class="vbquote">(Pegas @ 10:04:2007, 10:57 )</span><!--QuoteEBegin-->тогда может что-нибудь ещё посоветуете?
[snapback]61938" rel="nofollow" target="_blank[/snapback]​
[/quote]
Ну тогда RTL-евский вариант _isctype
 

grigsoft

Well-Known Member
15.11.2005
735
0
#9
Функция такая в любом случае это лишь малая часть работы :)
Код:
int MyIsDigit(char ch)
{
return (ch>='0' && ch<='9');
}
 
P

Pegas

Гость
#10
Большое спасибо, думаю теперь всё пойдёт как по маслу ;)
 
G

GRLEX

Гость
#11
а я бы посоветовал создать граф переходов, а затем автомат (матрицу), и таблицы грамматик.
если корректно указать все случаи, то числа будет разбирать автоматически.
И у тебя получится в итоге таблицы: констант, служебных слов.....

Как то давно писал, правдо для учебного языка - очень даже неплохо работает с автоматом.
 
Статус
Закрыто для дальнейших ответов.