我想知道像ANTLR这样的工具是否会被批准来解析这些规则,或者它是过火了,我应该创建我自己的解析器。
这是为了解析别人的格式,所以我不能改变它。这是为了好玩和练习,所以不要太烦恼。这些是用来描述语言中语音变化的规则。我会引用原作者的话
声音转换格式 希望任何语言学家都能熟悉规则的格式。例如,这里有一个声音变化:
c/g/V_V
这个规则说要在元音之间改变c到g。(我们将在下面介绍如何推广这条规则。) 更广泛地说,一个合理的变化是这样的:x/y/z
其中x是要改变的东西,y是它要改变的东西,z是环境。 Z部件必须始终包含下划线_,表示更改的部分。就这样,就像在gn/nh/_
它告诉程序无条件地用nh替换gn。 字符#代表单词的开头或结尾。所以u/o/_#
意思是用o代替u,但只在单词的末尾。 中间(y)部分可以是空白的,如s//_#
这意味着当s结束一个单词时,它就被删除了。 变量 环境(z部分)可以包含变量,如上面的V。这些都是在文件顶部定义的。我用大写字母来做这个,虽然这不是一个要求。变量只能是一个字符长。您可以定义声明声音更改所需的任何变量。例如,你可以把S定义为任意的停止,或者定义为任何日冕的K,或者什么的。 所以变量的定义和规则F=ie
c/i/F_t
意思是c在前元音之后和a t之前改变为i。 您也可以在前两部分中使用变量。例如,假设您定义了S=ptc
Z=bdg
S/Z/V_V
这意味着,在元音之间,停止ptc改变为它们的浊音对应物bdg。在这种用法中,变量必须对应1:1-p= b,t= d,等等。替换变量(这里Z)中的每个字符都给出了输入变量(这里S)中每个字符的转换值。确保两个变量的定义是相同的长度! 还可以将变量设置为固定值或删除。例如。Z//V_V
删除元音之间的浊音停止。 规则顺序 规则适用于它们所列的顺序。所以,用歌剧这个词和规则p/b/V_V
e//C_rV
第一个规则发出p的声音,导致obera;第二个规则删除辅音和中间音r之间的e,从而导致obra。 -p命令行参数可以帮助调试规则,因为它会使输出准确地显示应用于每个单词的规则。 环境中的可选元素 环境中的一个或多个元素可以用括号标记为可选元素。例如。u/ü/_C(C)F
当它后面跟着一个或两个辅音,然后是一个前元音时,就把u改为ü。
发布于 2009-12-17 16:51:25
虽然您的语言很简单,但是使用ANTLR有很多优点。
是的,你需要学习抗病毒药物疗法。如果您的语法有歧义,您将需要了解shift(减少冲突和减少冲突)。这可能是值得花的时间。
许多问题是词汇扫描或解析问题。了解如何创建词汇扫描器和解析器是一项有用的技能。
发布于 2009-12-19 02:29:55
如果您的问题仅仅是解析规则,那么您可能不需要解析器生成器。就像你说的,所有规则都是X/Y/Z格式,在任何语言中分裂它们都是非常容易的。
如果正如我所怀疑的那样,您正在创建一个工具来读取规则并将它们应用到文件中,那么问题就会复杂得多。
若要使用解析器生成器,假设您有一组固定的规则,则必须以解析器生成器所需的格式将它们转换为一组语法生成,并将它们提供给它。通过编译解析器生成器的输出,您将得到一个能够根据这些规则翻译文件的程序。考虑到您的规则似乎是上下文敏感的(c/g/V_V
),我建议寻找提供GLR (Tomita解析器)或钉住 (解析表达式语法)的解析器生成器。
如果您的规则集不是固定的,并且您的程序必须与文件一起读取它们才能进行转换,那么您真正需要的是一个文本转换引擎。在这种情况下,您将把X/Y/Z规则转换成适当的格式,并将其与源文件一起提供给引擎。
假设您不想编写自己的引擎,您可以查看通用宏处理器(M4,盖马,.)或者直接解释语言(珀尔,Lua,.)来帮助你。
例如,在Gema中,可以将c/g/V_V
转换为:
<vowel>c<vowel>=$1g$2
vowel:a=a;e=e;i=i;o=o;u=u;=@terminate
在Lua in:
function rule1(s)
return (string.gsub(s,"([aeiou])c([aeiou])","%1g%2"))
end
最后,它实际上取决于您是否需要为给定的一组规则创建某种东西,或者您是否需要能够读取和解释任何一组规则。
当然,在任何情况下,您都必须解析您的规则才能以正确的格式转换它们,但是,正如我在一开始所说的,语法在我看来非常简单,不能证明使用解析器生成器是合理的。
发布于 2009-12-17 16:37:45
在我看来,使用解析工具太过分了,特别是如果您还不熟悉可以完成这项工作的工具。
https://stackoverflow.com/questions/1925557
复制