0

我正在尝试为我的编译器类做一个语法文本校正器。这个想法是:我有一些规则,这是语言(在我的例子中是葡萄牙语)固有的,比如“一个有效的短语是主语动词形容词”,就像“Ruby is great”一样。

好的,所以首先我必须标记输入“Ruby 很棒”。所以我有一个文本文件“动词”,有很多动词,一行一行。然后我有一个文本“形容词”,一个“代词”等。

我正在尝试使用 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,但这也不是必需的。

谢谢。

4

2 回答 2

2

如果您想在编译时读取文件.. 使它们具有以下格式:

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;
}%%
于 2011-11-30T13:35:53.667 回答
0

使用野牛,我会手动编写词法分析器,它会在预定义的字典中查找单词。

于 2010-07-06T14:56:56.823 回答