参考希腊语标准化组织 ELOT 743 (Type 2 - transcription) (1982; 2001)
该标准的英文版可见维基百科
https://en.wikipedia.org/wiki/Romanization_of_Greek#Modern_Greek
词法分析
ELOT 743 Type 2 中的合法 token 有
α, αι, αυ, β, γ, γγ, γκ, γξ, γχ,
δ, ε, ει, ευ, ζ, η, ηυ, θ, ι, κ,
λ, μ, μπ, ν, ντ, ξ, ο, οι, ου, π,
ρ, σ , ς, τ, υ, υι, φ, χ, ψ, ω, ωυ
最长优先匹配 token
处理重音符
在此处需要注意αυ
ευ
ηυ
ωυ
并非单元音
在处理重音符αι
等区别
重音似乎不应该落在单独出来的 αυ
ευ
ηυ
ωυ
的 υ
上υι
的情况比较复杂υ
或 ι
都应该是 /i/
υί
一种可能
处理大写字母str.capitalize()
方法可以自动生成
语法分析
主要是处理 αυ
ευ
ηυ
ωυ
的转写规则
测试
现代希腊语版圣经 https://www.bible.com/languages/ell
源代码
词法分析
import ply.lex as lex
# lexical analysis
# =================
# basic tokens
ellinika_tokens = [ "α", "αι", "αυ",
"β",
"γ", "γγ", "γκ", "γξ", "γχ",
"δ",
"ε", "ει", "ευ",
"ζ",
"η", "ηυ",
"θ",
"ι",
"κ",
"λ",
"μ", "μπ",
"ν", "ντ",
"ξ",
"ο", "οι", "ου",
"π",
"ρ",
"σ", "ς",
"τ",
"υ", "υι",
"φ",
"χ",
"ψ",
"ω", "ωυ"]
# acute accent and diaeresis
ellinika_tokens += ["ά",
"έ", "αί", "αϊ", "αΐ",
"ή", "ί", "ύ", "εί", "οί", "εϊ", "οϊ", "εΐ", "οΐ",
"ό", "ώ",
"ού", "οϋ", "οΰ"]
# acute accent and diaeresis about αυ, ευ, ηυ, ωυ, υι
ellinika_tokens += ["αύ", "εύ", "ηύ", "ωύ", "υί"]
# capital letters
ellinika_tokens += [token[0].upper() + token[1:] for token in ellinika_tokens]
# longest tokens first
ellinika_tokens_sorted = sorted(ellinika_tokens, key=len, reverse=True)
tokens = ('ELLINIKA_CHAR',)
t_ELLINIKA_CHAR = r'|'.join(ellinika_tokens_sorted)
t_ignore = ' \t'
# lexical analysis error handling
def t_error(t):
print("Illegal character '%s'" % t.value[0])
t.lexer.skip(1)
lexer = lex.lex()
# test
data = "ΕΠΕΙΔΗ, πολλοί επιχείρησαν να συντάξουν διήγηση για τα πράγματα που σε μας είναι πλήρως βεβαιωμένα,\
καθώς μας τα παρέδωσαν αυτοί που εξαρχής έγιναν αυτόπτες μάρτυρες και υπηρέτες τού λόγου, \
φάνηκε εύλογο και σε μένα, που παρακολούθησα ακριβώς τα πάντα από την αρχή, να σου γράψω γι’ αυτά με τη σειρά, εξοχότατε Θεόφιλε. \
για να γνωρίσεις τη βεβαιότητα των πραγμάτων, για τα οποία κατηχήθηκες."
lexer.input(data)
print("Lexer output:")
for token in lexer:
print(token)
语法分析
import ply.yacc as yacc
# TODO