Как создать парсер, который токенизирует список слов, взятых из файла? - PullRequest
0 голосов
/ 26 июня 2010

Я пытаюсь сделать синтаксический текстовый корректор для класса моих компиляторов. Идея такова: у меня есть некоторые правила, которые присущи языку (в моем случае португальскому), например, «Действительная фраза - SUBJECT VERB ADJECTIVE», как в «Ruby is great».

Хорошо, сначала я должен токенизировать ввод "Ruby is great". Итак, у меня есть текстовый файл «глаголы», с множеством глаголов, один за другим. Тогда у меня есть один текст "прилагательные", один "местоимения" и т. Д.

Я пытаюсь использовать Ragel для создания парсера, но я не знаю, как я мог бы сделать что-то вроде:

%%{
  machine test;
  subject = <open-the-subjects-file-and-accept-each-one-of-them>;
  verb = <open-the-verbs-file-and-accept-each-one-of-them>;
  adjective = <open-the-adjective-file-and-accept-each-one-of-them>;
  main = subject verb adjective @ { print "Valid phrase!" } ;
}%%

Я посмотрел на ANTLR, Lex / Yacc, Ragel и т. Д. Но не смог найти тот, который, казалось бы, решил эту проблему. Единственный способ сделать это, о котором я мог подумать, - это предварительно обработать входной файл Ragel, чтобы моя программа считала файл и записала его содержимое в нужном месте. Но мне это решение тоже не нравится.

Кто-нибудь знает, как я мог это сделать? Нет проблем, если это не с Ragel, я просто хочу решить эту проблему. Я хотел бы использовать Ruby или Python, но в этом тоже нет необходимости.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 30 ноября 2011

Если вы хотите прочитать файлы во время компиляции .. сделайте так, чтобы они имели формат:

subject = \
ruby|\
python|\
c++

, затем используйте оператор ragel 'include' или 'import' (я забыл, какой .. должен проверитьруководство), чтобы импортировать его.


Если вы хотите проверить список предметов во время выполнения, возможно, просто заставить ragel прочитать 3 слова, а затем выполнить действие, связанное с каждым словом.Действие может прочитать файл и поиск, если слово хорошо или нет во время выполнения.

Действие читает текстовый файл и сравнивает содержание слова.

%%{
machine test

action startWord {
    lastWordStart = p;
}
action checkSubject {
   word = input[lastWordStart:p+1]  
   for possible in open('subjects.txt'):
       if possible == word:
           fgoto verb
   # If we get here do whatever ragel does to go to an error or just raise a python exception 
   raise Exception("Invalid subject '%s'" % word)
}
action checkVerb { .. exercise for reader .. ;) }
action checkAdjective { .. put adjective checking code here .. }

subject = ws*.(alnum*)>startWord%checkSubject
verb := : ws*.(alnum*)>startWord%checkVerb
adjective := ws*.)alnum*)>startWord%checkAdjective
main := subject;
}%%
0 голосов
/ 06 июля 2010

С бизоном я написал бы лексер вручную, который ищет слова в предопределенном словаре.

...