※ 引述《stayfool (fool)》之铭言:
: 在制作编译器前,会先把输入字串 展开成 语法树,
: 例如 result = 1 + 1,会先被解析成 语法树,才会再进行解析,
: 如果 输入字串 是英文的 this is a book 或是中文的 这是一本书,
: 也需要展开成语法树吗?
: 如果需要的话,该怎么展开呢?
: 目前在作一简易的翻译专题,故来请教,
: 另外网上是否有 关于此种专题的参考资料或连结呢?
: 若您知道的话,希望能提供给我,谢谢。
基本上自然语言(人类的文章或口语)和程式语言完全是两回事。
程式语言的文法是严格定义出来的,文法明确,固定只有几种句型,句型中带子句,
只有单一解释方式,避开模棱两可的状况。
自然语言同一个句子有可能分析成不同结构,可能符合的句型多到一塌糊涂,
有时候甚至要看其意义合理不合理,看前后文叙述的是什么人事物,
英文同一个字可以当动词又可以当名词,中文字连断词都可以有不同断法。
例句: Time flies like an arrow. Fruit flies like a banana.
光阴似箭 果蝇喜欢吃香蕉
在文法简单的状况下,你可以使用 brute force parsing,一个个句型去比对,
把所有可能的语法分解方式都找出来,
化为 1F 推文说的 concrete syntax tree (我习惯叫它 parse tree)。
如果句型加习惯用法太多,brute force parsing 速度慢到完全不实用,
可能就要改用 chart parsing 来做。
英文大致上的程序是: 查字典 -> 分析母句 -> 往下分析子句 -> 往上把树连结起来
中文则需要多一道手续: 先找词库出来断词之后才有办法翻词典。
这个部份的程式,用 brute force parsing 来实作应该不会太难,只是执行效果差。
不要想用 yacc 或 bison 了,自然语言的文法通常没办法靠这类 parser generator
帮你自动产生程式码。但你若要自己写 compiler 这工具就很适合。
参考资料可以到陈信希老师的个人网页和实验室网页挖挖看。
我是很想推荐陈老师上课用的课本,可是要你为了做专题唸完半本书有点强人所难。